17.Express中间件

1.应用级中间件

  • 每个请求到来之前都会调用(可以做权限校验)
app.use((request, response, next)=>{
	// 自定义代码块
	// 如果想要继续往下执行
	next();
})

2.路由级中间件

  • 使用较少,http://127.0.0.1:3000/news/add只会进入到第一个视图
  • 如果使用了路由中间件,则可以指定其继续向下匹配,从而匹配到第二个视图
app.get('/news/add', (req, res, next)={
	// 自定义代码块执行
	console.log('测试');
	// 继续往下匹配
	next();
})

app.get('/news/:id', (req, res)=>{
	res.send("新闻动态路由");
})

3.错误处理中间件

  • 在路由执行结束后
app.use((request, response, next)=>{
	// 自定义代码块(当响应状态码为404时,返回页面不存在文本)
	response.status(404).send("页面不存在");
})

4.内置中间件

  • 配置静态web访问目录
app.use(express.status("static"))  
// 配置前访问:http://127.0.0.1:3000/static/css/base.css
// 配置后访问:http://127.0.0.1:3000/css/base.css

5.第三方中间件

1.body-parse,获取post提交的请求体
    1. 安装依赖
    cnpm install body-parser --save
    
    1. 引用
    const bodyParser = require('body-parser')
    
    1. 配置中间件
    app.use(bodyParser.urlencoded({extended: false}))  // 处理form表单
    app.use(bodyParser.json())  // 处理json对象
    
    1. 获取post数据
    let body = request.body;
    console.log(body.username)
    
2.cooike-parser,处理cookie数据
    1. 安装依赖
    cnpm install cookie-parser --save
    
    1. 引用
    const cookieParser = require('cookie-parser')
    
    1. 配置中间件
    app.use(cookieParser())
    
    1. 设置cookie
    app.get('/', (request, response)={
    	response.cookie(
    		"username", "jack",  // 也可以将对象作为值{"name": "xxx", "age": 22}
    		{
    			maxAge: 1000 * 60 * 60  // 过期时间毫秒
    			// signed: boolean  // 是否签名COOKIE,如果设置为true,就需要使用response.signedCookies而不是response.cookie访问他,被篡改的cookie会被服务器拒绝,并且COOKIE值会重置为他的原始值(防止cookie被篡改)
    			// expires: Date  // 过期时间,Date类型
    			// httpOnly: boolean  // 是微软对COOKIE做的扩展,如果设置为true,则无法通过(JS脚本、applet等)读取到COOKIE信息,方式XSS攻击
    			// path: string  // 设置cookie生效的路径
    			// domain: string  // 多域名共享(二级)例如:news.tencent.com 和 music.tencent.com ---> '.tencent.com'
    			// secure: boolean // 设置为true时,在HTTP中无效,HTTPS中才有效
    			// encode: string  //
    			// sameSite: boolean | 'lax' | 'strict' | 'none'
    		},
    	)
    })
    
    • cookie加密
      • 1.配置中间件时需要传入密钥app.use(cookieParser('13k4mdk3mdm5k30df9sfm4kgj8dsfmk34'))
      • 2.设置COOKIE时signed:true
      • 3.获取COOKIE时需要使用response.signedCookies.username
    1. 获取cookie
    request.cookies.username
    response.signedCookies.username  // 获取加密cookie
    
    1. 销毁cookie
    response.cookie("username", "jack", {maxAge: 0})
    
3.express-session,处理session数据
    1. 安装依赖
    cnpm install express-session --save
    
    1. 引用
    const session= require('express-session')
    
    1. 配置中间件
    app.use(session(
    	{
    		secret: "su2udnbu2bjdbwhb32lknfrltk5mkfre5lm",  // 服务端生成session的签名
    		name: "xxx",  // 修改session对应cookie的名称
    		// store: Store | MemoryStore,  // 处理分布式session,使用数据库存储 
    		resave: false,  // 强制保存session即使他并没有变化,默认即可
    		saveUninitialized: true,  // 强制将未初始化的session存储,默认即可
    		cookie: {  // session的传递依赖于cookie,服务端存储session信息后会返回一个sessionId,该sessionId会存储在cookie中返回给浏览器,后续浏览器会在cookie中携带此sessionId来访问服务器,服务器从cookie中解析出sessionId,然后根据该sessionId查询到session对象,从而得到session信息
    			maxAge: 1000 * 60
    		},
    		rolling: true  // session未过时期间,每次访问会重置过期时间
    	}
    ))
    
    1. 设置session
    app.get('/', (request, response)={
    	request.session.username = "lucy";
    	request.session.age= 22;
    })
    
    1. 获取session
    request.session.username
    
    1. 销毁session
    request.session.cookie.maxAge = 0;
    

6.分布式session

  • 使用mongodb数据库存储session信息
1.下载connect-mongo模块
cnpm install connect-mongo --save
2.模块引入
const session = require('express-session');
const MongoStore = require('connect-mongo');
3.配置中间件
app.use(session(
	{
		secret: "su2udnbu2bjdbwhb32lknfrltk5mkfre5lm",
		resave: false,
		saveUninitialized: true,
		cookie: {
			maxAge: 1000 * 60
		},
		rolling: true,
		// 会自动创建test-app库和sessions集合
		store: MongoStore.create({ 
			mongoUrl: 'mongodb://127.0.0.1:27017/test-app',
			touchAfter: 24 * 3600  // 不管发出多少请求,在24小时内只更新一次session,除非改变了这个session
		})
	}
))
4.其他存储
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值