node-04-node模块-第三方模块

3.第三方模块 1.npm
全称:node pageage manager
官网: https://www.npmjs.com/
01-npm是什么 NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题
02-使用场景

  • 允许用户从NPM服务器下载别人编写的第三方包到本地使用
  • 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用
  • 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用
03-步骤 步骤
1.先去上面官网搜索需要的模块,查看文档
2.创建一个非中文且不与模块同名的文件夹,打开终端输入
npm init -y //会生成一个package.json文件,记录模块的大版本信息

3.在终端先输入输入,配置npm指向淘宝镜像(只需要输入第一次)
设置npm为淘宝镜像,npm为淘宝镜像 npm config set registry https://registry.npm.taobao.org/

//恢复npm地址 npm config set registry https://registry.npmjs.org

再输入
第一次导入这个模块,输入npm i 模块名//生成一个package-lock.json和node_modules文件,npm5版本后才有,记录模块的详细信息,如果模块node_modules被删除了,第二次导入这个模块,输入npm i//不需要加模块名,package-lock.json里面存了版本信息

4.将文档的模板代码复制下来放在自己创建js文件中
04-npm i 模块名
  1. 第一次安装 会新增package-lock.json文件及node_modules文件夹
  2. 第二次安装
    1. 把模块的信息保存到package-lock.json
    2. 模块的信息 在package.json中也会保存一份
    3. node_modules中会保存,下载的第三方模块
  3. 上述操作都是自动的,不需要人为的操作,知道干了什么事即可
05-npm i 如果 package.json 及 package-lock.json中已经记录了第三方模块信息
npm i
读取记录的信息,自动全部下载
2.爬虫crawler模块
步骤
1.先去上面官网搜索crawler,查看文档
2.创建一个非中文文件夹,打开终端输入
npm init -y

3.在终端先输入输入,配置npm指向淘宝镜像(只需要输入第一次)
设置npm为淘宝镜像,npm为淘宝镜像 npm config set registry https://registry.npm.taobao.org/

//恢复npm地址 npm config set registry https://registry.npmjs.org

再输入
npm i crawler

4.将文档的模板代码复制下来放在自己创建js文件中
3.Express模块
1.查看文档 http://www.expressjs.com.cn/
2.,创建一个非中文文件夹,在终端输入
npm init -y

3.再输入,下载并安装模块包
npm install express

4.将文档中的代码复制到js文件中
//基本使用,但是将返回的数据写死了 const express = require('express') const app = express() app.get('/', function (req, res) { res.send('Hello World') }) app.listen(3000);

利用 Express 托管静态文件
//参考相对路径(启动node进程的目录),容易出错 app.use(express.static('public'))

如果要使用多个静态资源目录,请多次调用 express.static 中间件函数:
app.use(express.static('public')) app.use(express.static('files'))

注意:为获得最佳结果,请[使用反向代理]缓存来提高服务静态资产的性能。
为该express.static函数提供的文件创建虚拟路径前缀(文件系统中实际不存在该路径),并提供绝对路径
app.use('/static', express.static(path.join(__dirname, 'public')))

升级后代码
const express = require('express')const path = require('path')const app = express()//'/static'可以不写,后面输入网址也就不写/static app.use('/static', express.static(path.join(__dirname, 'public')))//app.get('/', function (req, res) { // res.send('Hello World') //}) app.listen(3000);

http://localhost:3000/static/images/kitten.jpg http://localhost:3000/static/css/style.css http://localhost:3000/static/js/app.js http://localhost:3000/static/images/bg.png http://localhost:3000/static/hello.html

路由模块
网址
http://www.expressjs.com.cn/guide/routing.html 找到express router
为什么要拆分路由
  1. 实际项目逻辑会拆分到不同 的文件中
  2. 项目越大,文件拆的越碎
  3. 文件越碎,分工越明确,维护起来越方便
基本使用
1.创建app.js
//导包 const express = require('express') const path = require('path')const bodyParser = require('body-parser') const cors = require('cors')//找到userRouter.js文件的路径进行拼接 const userRouter = require(path.join(__dirname, 'route', 'userRouter.js'))//创建服务器 const app = express(); //解决跨域问题 app.use(cors()); // 设置请求头 app.use(bodyParser.urlencoded({ extended: false }))//导入用户路由 app.use('/user',userRouter); //监听服务器 app.listen(3000, () => { console.log('success'); })

2.创建route文件夹,里面建立userRouter.js
const express = require('express') //调用express中的router方法,分发路由 const router = express.Router()const path = require('path')//导入数据库连接模块,db模块是自己写的,目的是为了将服务器与数据库进行连接 const db = require(path.join(__dirname,'../utils','db.js')) console.log(db); //用户注册 router.post('/register',(req,res)=>{ // console.log(req); //获取用户输入的用户名和密码 const {username,password} = req.body; // console.log(username,password); //查询数据库,看用户名是否被注册 db.connection.query(`select username,password from user where username = '${username}'`,(error,results)=>{ if(error == null){ if(results.length == 0){ //长度为空说明找不到改用户名,可以注册 //将数据添加到数据库 db.connection.query(`insert into user(username,password)values('${username}','${password}')`,(err,data)=>{ if(err==null){ res.send({ code:200, msg:'注册成功' }) } }) }else{ //不为0,则说明已经存在,被注册 res.send({ code:400, msg:'该用户名已经被注册' }) } }else{ res.send({ code:500, msg:'服务器内部错误' }) } }) })//用户登录 //注意此处不是app了而是router router.post('/login',(req,res)=>{ //获取用户输入的用户名和密码 const {username,password} = req.body; //查询数据库,看用户名和密码是否正确 db.connection.query(`select username,password from user where username = '${username}' and password = '${password}'`,(error,results)=>{ if(error == null){ //判断results的length属性是否为0,为0则用户名或密码错误 if(results.length == 0){ res.send({ code:400, msg:'用户名或密码错误' }) }else{ //不为0,则输入正确 res.send({ code:200, msg:'登录成功' }) } }else{ res.send({ code:500, msg:'服务器内部错误' }) } }) }) //将router暴露出去 module.exports = router

3.创建utils文件夹,db.js在(5.暴露模块)那里
4.nodemon模块
作用
nodemon是一种工具,通过在检测到目录中的文件更改时自动重新启动节点应用程序来帮助开发基于node.js的应用程序
网址:
https://www.npmjs.com/package/nodemon
安装
先初始化,输入
npm init -y

nodemon将全局安装到您的系统路径
npm install -g nodemon

用于在执行脚本时nodemon替换node命令行上的单词
5.body-parser
作用
把post的文本数据放到 req.body属性中
网址
https://www.npmjs.com/package/body-parser
安装
在终端输入
npm i body-parser

使用案例
var express = require('express') var bodyParser = require('body-parser') var app = express() //使用 body-parser 第三方模块, 作用是设置请求头 //设置请求头的意思是, 把用户传递过来的参数转成url的格式 app.use(bodyParser.urlencoded({ extended: false })) // parse application/json app.use(bodyParser.json()) app.use(function (req, res) { res.setHeader('Content-Type', 'text/plain') res.write('you posted:\n') res.end(JSON.stringify(req.body, null, 2)) })

6.multer
作用
Multer 会添加一个 body 对象 以及 filefiles 对象 到 express 的 request 对象中
网址
https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md
注意: Multer 不会处理任何非 multipart/form-data 类型的表单数据。
安装
npm i multer

基本使用
var express = require('express') var multer= require('multer') var upload = multer({ dest: 'uploads/' })var app = express()app.post('/profile', upload.single('avatar'), function (req, res, next) { // req.file 是 `avatar` 文件的信息 // req.body 将具有文本域数据,如果存在的话 })app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) { // req.files 是 `photos` 文件数组的信息 // req.body 将具有文本域数据,如果存在的话 })var cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) app.post('/cool-profile', cpUpload, function (req, res, next) { // req.files 是一个对象 (String -> Array) 键是文件名,值是文件数组 // // 例如: //req.files['avatar'][0] -> File //req.files['gallery'] -> Array // // req.body 将具有文本域数据,如果存在的话 })

上面uploads文件夹中的图片是不带格式的,可以通过下面方法创建uploads文件夹
//导包 const multer = require('multer') //uploads文件夹路径 const picPath = path.join(__dirname,'../uploads') const storge = multer.diskStorage({ //创建uploads文件夹 destination: function (req, file, cb) { cb(null, picPath) }, //文件名 filename: function (req, file, cb) { cb(null, "hero" + '-' + Date.now()+'.png') } })const upload = multer({ storage: storge })

7.cors
node-04-node模块-第三方模块
文章图片

作用
解决浏览器访问接口时不能跨域的问题
网址
https://www.npmjs.com/package/cors
安装
npm i cors

基本使用
var express = require('express') var cors = require('cors') var app = express() app.use(cors()) app.get('/products/:id', function (req, res, next) { res.json({msg: 'This is CORS-enabled for all origins!'}) }) app.listen(80, function () { console.log('CORS-enabled web server listening on port 80') })

8.mysql
介绍
这是mysql的nodejs驱动程序,可以让我们将node.js与数据库连接起来,进行增删改查
基本使用
//导包 var mysql= require('mysql'); //和要操作的数据库建立连接 var connection = mysql.createConnection({ host: 'localhost', user: 'me',//修改成自己数据的用户名 password : 'secret',//修改成自己数据的密码 database : 'my_db'//自己设置的库 }); //开启连接 connection.connect(); //第一个参数是要执行的sql语句 connection.query('select * from person', function (error, results, fields) { //报错信息, 如果沒有错就是null console.log(error); //执行sql語句後返回的結果 console.log(results); //是字段描述 console.log(fields); }); //关闭连接 connection.end();

要修改的一些参数
node-04-node模块-第三方模块
文章图片

常见错误
// Cannot enqueue Query after invoking quit. // 原因:意思是使用connection.end的时候,connection已经关闭了. //解决办法: //1.将connection.end注释掉 //2.重新建立连接,将代码封装成函数,下面调用 let connection; function setConnect() { //设置与数据库的连接 connection = mysql.createConnection({ host: 'localhost', user: 'root', password: 'root', database: 'user' }); //连接开启 connection.connect(); }

9.cookie-parser
介绍
设置和获取cookie的插件
基本使用
在终端输入
npm i cookie-parser

//导包 const express = require('express') const cookieParser = require('cookie-parser') //开启服务器 const app = express() //调用模块 app.use(cookieParser()) //注册路由,设置cookie app.get("/setCookie",(req, res) => { console.log(res.cookie("add", "hello", { maxAge: 900000 })); res.send('hehe') }) //注册路由,获取cookie的值 app.get("/getCookie",(req,res)=>{ console.log(res.cookie.add); res.send('haha') })//监听服务器 app.listen(3000, () => { console.log('success'); })

4.导入自己编写的模块
// Importing a local module: const myLocalModule = require('./path/myLocalModule'); // Importing a JSON file: const jsonData = https://www.it610.com/article/require('./path/filename.json'); // Importing a module from node_modules or Node.js built-in module: const crypto = require('crypto');

  1. require接受一个参数,形参名为id,类型是String。
  2. require函数return的是模块到处的内容,类型是任意。
  3. require函数可以导入模块、JSON文件、本地文件。模块可以通过一个相对路径从node_modules、本地模块、JSON文件中导出,该路径将针对__dirname变量(如果已定义)或者当前工作目录
//导包 const express = require('express'); const path = require('path'); const bodyParser = require('body-parser'); //const multer = require('multer'); //找到自己编写的js文件,通过path.join拼接成绝对路径,并用变量接收 const dbPath = path.join(__dirname, 'utils', 'db.js'); //将模块路径导入 const db = require(dbPath); //解决跨域的包 //const cors = require('cors'); //创建upload文件夹 //const upload = multer({ dest: 'uploads/' })//创建服务器 const app = express(); //设置请求头,将数据设置为url键值对格式 // parse application/x-www-form-urlencoded app.use(bodyParser.urlencoded({ extended: false }))//app.use(cors()); //查询英雄列表(获取所有的英雄) app.get('/list',(req,res)=>{ //获取所有的英雄逻辑代码 //调用db中的getHeros方法. const data = https://www.it610.com/article/db.getHeros(); //返回的就是所有的英雄数据 if(data){ res.send({ code:200, msg:"获取成功", data }); }else { res.send({ code:400, msg:"获取失败" }); } });

5.暴露模块 【node-04-node模块-第三方模块】使用module.exports将模块暴露出去
//db.js文件 //导入mysql包 const mysql = require('mysql') //将本地服务器与数据库链接 const connection = mysql.createConnection({ host: 'localhost', user: 'root', password : 'root', database : 'user' }); //链接开启 connection.connect(); //将connection这个对象暴露出去 module.exports = { connection//属性简写实际是connection:connection } //链接结束 // connection.end();

    推荐阅读