接上篇
五、express中间件
中间件(Middleware) 是一个函数,它可以访问请求对象(request object (req)),响应对象(response
object (res)), 和 web 应用中处于请求-响应循环流程中的中间件,一般被命名为 next 的变量。
🧨中间件的功能:
- 执行任何代码。
- 修改请求和响应对象。
- 终结请求-响应循环。
- 调用堆栈中的下一个中间件。
(1)应用级中间件
// 应用级中间件(用于权限判断 )
app.use((req,res,next)=>{
console.log(new Date());
// console.log("")
next() //如果想继续向下执行app...,就需要写next()
})
(2)内置中间件
可以配置静态服务目录
//静态服务
app.use("/static",express.sat
(3)第三方中间件
body-parser 中间件 第三方 获取post提交数据
cnpm i body-parser --savevar bodyParser=require("body-parser")
设置中间件
//处理form表单的中间件
app.use(bodyParser.urlencoded({extended:false}));
//form表单提交的数据
(4)路由级中间件
// 路由级中间件(用的比较少)
app.get("/news/add",(req,res,next)=>{
// res.send("执行增加新闻")
console.log("执行增加新闻")
next()
})
(5)错误中间件
// 3.错误中间件
app.use((req,res,next)=>{
res.status(404).send("404")
})
六、Cookie
(1)概念
cookie是存储于访问者的计算机中的变量,可以让我们用同一个浏览器访问同一个域名的时候共享数据也可以把上次输入的用户名保存,在下次打开该页面是会直接输入框中
就像京东没有登陆时,也可以把商品添加到购物车,而这添加就被保存在cookie里
(2)使用
✨✨✨
属性 | 描述 |
---|---|
domain | 域名name =value 键值对,可以设置要保存的key/value ,注意这里的name不能和其他属性项的名字一样 |
Expires | 过期时间(秒),在设置的某个时间点后该Cookie 就会失效 |
maxAge | 最大失效时间(毫秒),设置在多少后失效 |
secure | 当secure值为true时,cookie 在HTTP中是无效的,在HTTPS中才有效的 |
Path | 表示cookie影响到的路径,如path=/ ,如果路径不能匹配时,浏览器则不能发送COOKIE |
httpOnly | 是微商对COOKIE做的扩展,如果在COOKIE中设置了“httpOnly”属性,则通过程序(JS脚本)将无法读取到COOKIE信息,防止攻击XXS攻击产生 |
signed | 表示是否签名cookie,设为true会对这个cookie签名,这样就需要用res.signedCookies而不是res.cookies访问它,被篡改的签名cookie会被服务器被拒绝,并且cookie值会重置为它的原始值 |
七、express session的基本使用
(1)简单介绍
session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而session保存在服务器上
(2)session的工作流程
当浏览器访问服务器并发送第一次请求时,服务器会创建一个session对象,生成一个类似于key,value的键值对,然后key(cookie) 返回到浏览器端,浏览器下次在访问时,携带key(cookie),找到相对应的session(value)
(3)express-session的使用
//安装
cnpm i express-session --save
//引入express-session
var session=require("express-session")
//设置官方文档提供的中间件
app.use(session({
secret:"keyboard cat",
resave:true,
saveUninitialized:true
}))
//使用
设置值 req.session.username="张三"
获取值 req.session.username
(4)负载均衡配置session,把session信息保存到数据库里面
我们可以把数据存储在数据库里面。
https://www.npmjs.com/package/connect-mongo
store: MongoStore.create({
mongoUrl: 'mongodb://user12345:foobar@localhost/test-app?authSource=admin&w=1',
mongoOptions: advancedOptions // See below for details
}
现如今connect-mongo以及更新了,如上所示
(5)把session信息保存在redis里面
https://www.npmjs.com/package/connect-redis
npm install redis connect-redis express-session
也可以保存在MySQL里面
https://www.npmjs.com/package/connect-mysql
八、multer上传图片
(1)模块介绍
Multer 是一个node.js中间件,用于处理表单数据,它主要用于上传文件,它是在busboy之上非常高效
注意:Multer 不会处理任何非multipart/form-date类型的表单数据
(2)使用
安装:npm install --save multer
(3)express上传文件模块multer的使用
要上传图片的话必须在form表单里添加
<form action="/profile" method="post" enctype="multipart/form-data">
<input type="file" name="avatar" />
</form>
(4)指定图片文件名的方法
//-------------------------------
//-------------------
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, '/tmp/my-uploads')
},
filename: function (req, file, cb) {
const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9)
cb(null, file.fieldname + '-' + uniqueSuffix)
}
})
const upload = multer({ storage: storage })
(5)express按照日期生成上传文件目录,也可以上传文件
https://www.npmjs.com/package/silly-datetime
npm i silly-datetime --save
创建目录 npm i mkdirp --save
(6)上传多个文件
const multer = require("multer")
const path = require("path")
const sd=require("silly-datetime")
const mkdirp=require("mkdirp")
let tools = {
multer() {
// 配置上传目录
const storage = multer.diskStorage({
destination: async (req, file, cb) =>{
// 1.获取当前日期
let day=sd.format(new Date(),"YYYYMMDD")
let dir=path.join("static/upload",day)
// 按照日期生产图片存储目录
await mkdirp(dir) //要等待dirp上传完毕,再执行下一行,这是一个异步方法
cb(null, dir) ///上传之前目录必须存在
},
// 修改上传后的文件名
filename: function (req, file, cb) {
// 1.获取后缀名
let extname = path.extname(file.originalname)
// 2.根据时间戳生成文件名
// const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9)
// cb(null, file.fieldname + '-' + uniqueSuffix)
cb(null, Date.now() + "." + extname)
}
})
const upload = multer({ storage: storage })
return upload
}
}
module.exports=tools