常用模块安装
基于express项目中需要另外引入的模块,其他的在我们创建项目时自动添加的我这里就没介绍
# i是install的缩写,删除时可以使用un代替i,un既是uninstall的缩写
npm i express-generator -g # 安装全局express脚手架
express xxx -e # 创建基于.ejs的项目
npm i -g nodemon # 这个安装为全局,用来解决实时刷新页面,实现node服务器与数据库服务器的重启
npm i multer # 安装编写上传文件接口需要的模块
npm i bcryptjs # 安装密码加密需要的模块
npm i jsonwebtoken # 安装服务器端传送token需要的模块
npm i express-jwt # 安装验证token存不存在需要的模块
npm i cors # 安装服务器端解决跨域需要的模块
npm i moment # 安装日期格式化需要的模块
npm i mongoose # 安装使用mongoDB数据库需要的模块
npm i body-parser # 安装解决上传文件大小受限需要的模块
npm i cheerio # 实现服务器端操作DOM
# 非常常用,内部封装了ajax,通常也是用来发送四种方式的请求,
# get,post,put,delete(这种方式没有数据,只有一个参数url,传参时要在url后面进行拼接)
npm i axios
常用模块介绍及使用
nodemon
在node环境中,改变js文件要重新执行页面才会有变化。
nodemon是监听nodejs代码变化的工具,会自动完成node服务器与数据库服务器的重启
使用如上图,就是在package.json
文件中的scripts对象中加上"serve": "nodemon ./bin/www"
,这段代码的对象名是自己命名的,运行时就执行npm run serve
这个命令就可以了,其实执行的就是后面的这个对象值,我们直接输入nodemon ./bin/www
也可以运行程序。
multer
Multer 是一个 node.js 中间件,用于处理 multipart/form-data 类型的表单数据,它主要用于上传文件。它是写在 busboy 之上非常高效。
Multer 只会处理 multipart/form-data 类型的表单数据。服务器端写接口具体用法如下:
const multer = require('multer'); // 引入模块
# 配置当前上传文件的路径信息
var storage = multer.diskStorage({
# 表示文件在服务器端的存储路径
destination: function (req, file, cb) {
cb(null, './public/avatars')
},
# 上传之后的文件名
filename: function (req, file, cb) {
cb(null, file.fieldname + '-' + Date.now() + file.originalname);
}
})
var upload = multer({ storage: storage });
# single中的参数表示file的name属性, 解析formData数据
router.post("/upload_files", upload.single('img'), (req, res) => {
# 输出设置,我这里是把文件链接返回给前端了,
res.json({
msg: "上传成功",
info: "http://192.168.18.3:8000/avatars/" + req.file.filename,
});
});
前端需要通过这个接口先把formdata中存储的文件数据信息传送过来,前端只能发送formdata类型的数据,因为multer只会处理 multipart/form-data 类型的表单数据
bcryptjs
bcryptjs是一个第三方密码加密库,是对原有bcrypt的优化,优点是不需要安装任何依赖,用法如下:
const bcrypt = require('bcryptjs'); // 引入密码加密模块
bcrypt.hashSync(params); # 使用这个方法对前端传过来的密码进行同步加密处理,里面的参数就是前端传来的密码数据
# 验证密码是否相同,第一个参数是传过来的密码,第二个是数据库存的密码
var isValidate = bcrypt.compareSync(params, params1);
jsonwebtoken
jwt 全称是Json Web Token,它是一种数据加密技术,是目前比较流行的令牌数据加密方案,服务器端可以返回给前端一个token用作以后的判断,用法如下:
const jwt = require('jsonwebtoken'); # 首先引入创建token的模块
# 第一个是把什么数据当作token,是个对象,第二个是密钥,自己设定,第三个是token过期时间,也是自己设定
# 10h就是十个小时,1day就是一天
# sign是生成token
const token = jwt.sign({params}, tokenKey,
{
expiresIn: '10h'
});
# 解析token,返回值是token数据对象,第一个参数是前端传来的token,第二个参数是自己设置的密钥,
# 如果之前设置token数据用的是id,那么通过tokenData.id就可以取到设置token用的id值
const tokenData = jwt.verify(authorization, tokenKey);
express-jwt
express-jwt是nodejs的一个中间件,他来验证指定http请求的JsonWebTokens的有效性,如果有效就将JsonWebTokens的值设置到req.user里面,然后路由到相应的router。 此模块允许您使用Node.js应用程序中的JWT令牌来验证HTTP请求。 JWT通常用于保护API端点。
express-jwt内部引用了jsonwebtoken,对其封装使用。 在实际的项目中这两个都需要引用,他们两个的定位不一样。jsonwebtoken是用来生成token给客户端的,express-jwt是用来验证token的。
用法如下:
# 引入token验证模块,用来在express中验证jwt有没有存在
const jwtMiddle = require('express-jwt');
# 查看和修改用户信息时需要验证密钥,这样执行下面的路由查找时都要先验证token,token不存在就不会执行下面编写的路由,因此在express脚手架中通常写在路由封装的文件中即创建项目自动生成的app.js文件
app.use(
jwtMiddle({
secret: tokenKey,
})
);
app.use('/api/userMsg', require('./routes/api/userMsg'));
cors
cors是后端即服务器端常用来解决跨域的一种方式,具体介绍及使用可以参考nodejs中解决跨域方法
moment
用来解析建数据库时自动生成的日期,用于日期格式化,可以查看moment.js插件文档
用法如下:
# 主路由引入才可以在html页面中利用方法进行日期格式化,
app.locals.moment = require('moment')
# 但是如果不是在页面中直接使用方法,就是在哪使用在哪引入文件
const moment = require('moment')
# 第一个参数是传进的时间数据,format是把传进的时间格式化成什么类型的,这里是2020-10-03 4:34:34这种类型的,这是常用的方法
moment(v).format('YYYY-MM-DD h:mm:ss')
mongoose(数据库模块)
Mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具
用法如下:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
# 连接数据库,在express脚手架中通常写在app.js文件中,DB是数据库名,自己定义,第二个参数加上不会出现一些警告,不加也没事
mongoose.connect("mongodb://localhost:27017/DB", { useUnifiedTopology: true, useNewUrlParser: true })
.then((res) => { console.log("数据库连接成功"); })
.catch((err) => {
console.log(err);
});
# 创建数据库的数据结构,参数就是字段名,最里面是限定字段条件
const cartSchema = new Schema({
GoodsId: {
type: Number,
required: true,
},
GoodsToken: {
type: String,
required: true,
},
GoodsImg: {
type: String,
// required: true,
},
GoodsTitle: {
type: String,
},
# 商品数量
GoodsNum: {
type: Number,
},
# 单个产品价格
GoodsPrice: {
type: Number,
},
}, { timestamps: true } # // 加上这第二个参数数据库表在新增或修改数据时自动往表中提供一个时间戳createdAt和updatedAt
);
# 创建一个实例表对象,第一个参数是表名,第二个就是创建的数据库中的表结构实例对象
const Cart = mongoose.model('carts', cartSchema);
module.exports = Cart;
# 使用表时要先引入,使用自己创建的哪个表就引入哪个,多个表的关联可以使用id进行,具体看情况
const Cart = require('../../models/cart');
# 保存到数据库很简单,就是调用save()方法就好
Cart.save()
# 操作数据库方法,前面使用promise方法,尽量都加上await,但是async也不能少,具体操作看情况
Cart.find() # 参数也是个对象,根据条件查找
# 两个参数,可以不是对象,第一个是查找条件,这个就是根据id查找的,第二个是修改的数据,这就要求前端输入框的name属性必须跟字段名一样
# 不需要修改的数据,可以用delete删掉,再执行下面这句,就可以直接更新数据库表中的一些信息
Cart.findByIdAndUpdate(params,params1)
Cart.findOneAndDelete(params) #参数是个条件对象,根据条件删除表中的一些数据,筛选条件可以多写
body-parser
body-parser是一个HTTP请求体解析的中间件,使用这个模块可以解析JSON、Raw、文本、URL-encoded格式的请求体,用这个模块可以改变express框架默认的上传文件大小1Mb
具体使用参看上传文件大小受限的解决办法
cheerio
cheerio是jquery核心功能的一个快速灵活而又简洁的实现,主要是为了用在服务器端需要对DOM进行操作的地方
var cheerio = require('cheerio'),
# 这样就像在使用jQuery的$方法
$ = cheerio.load('<h2 class = "title">Hello world</h2>');
$('h2.title').text('Hello there!');
$('h2').addClass('welcome');
$.html();
# => <h2 class = "title welcome">Hello there!</h2>