Express--中间件
一、什么是中间件
**中间件:**就是 做中间代理的操作。大多数情况下,中间件就是在做接收到请求和发送响应中间的一系列操作。
事实上,express是一个路由和中间件的web框架,Express 应用程序基本上是一系列中间件函数的调用。
输入网址到渲染的过程:
- 浏览器发送请求
- express接受请求
中间处理的过程,就是:中间件
- 路由函数处理渲染(
req, res
) -
res.render
渲染
二、中间件的作用
- 执行任何代码。
- 对请求和响应对象进行更改。
- 结束请求/响应循环。
- 调用堆栈中的下一个中间件函数。
三、中间件的分类
中间件也分为应用层中间件、路由中间件、内置中间件、错误处理中间件和第三方中间件。
3.1、应用层中间件
在进行路由匹配之前或再录又要继续向下执行时想做个操作,那么应用层中间件无疑是好的选择。
实例
将之前封装的 解析 GET参数来封装成一个类型req.query
的中间件
封装:
// 自己封装的一个中间件:类似 `req.query`
app.use((req, res, next) => {
try {
let strArr = req.url.split('?')
if (strArr.length > 0) {
let queryStr = strArr[1]
let queryArr = queryStr.split('&')
let obj = {}
queryArr.forEach(v => {
let str = v.split('=')
let name = str[0]
let value = str[1]
obj[name] = value
})
// 将解析后的对象,放在req的myQuery属性上
req.myQuery = obj
}
}catch (err) {
req.myQuery = {}
}finally {
// 使其进入下一步
next()
}
})
使用:
app.get('/search', (req, res) => {
res.json(req.myQuery)
})
3.2、路由中间件
路由级中间件和应用级中间件类似,只不过他需要绑定express.Router();
// 实例化路由模块,此路由模块相当于一个小的app实例
const router = express.Router()
总之在检测用户登录和引导用户应该访问哪个页面是,路由中间件绝对好用。
简单实例
设置一个模块为 mall商城
,商城里面有首页/
和商城产品列表页/list
// 实例化路由模块,此路由模块相当于一个小的app实例
const router = express.Router()
// 访问 '/mall'
router.get('/', (req, res) => {
res.send('商城首页')
})
// 访问 '/mall/list'
router.get('/list', (req, res) => {
res.send('商城产品列表页')
})
app.use('/mall', router)
封装实例
可以将这个模块放置在 routes
这个文件夹里,这样就可以反复调用
routes --> mall.js
const express = require('express')
// 实例化路由模块,此路由模块相当于一个小的app实例
const router = express.Router()
// 在 路由中间件 也可以使用 应用层中间件
/*
router.use((req, res, next) => {
console.log('判断是否使商城用户..')
next()
})
*/
router.get('/', (req, res) => {
res.send('商城首页')
})
router.get('/list', (req, res) => {
res.send('商城产品列表页')
})
module.exports = router
在主文件调用 app.js
const mallRouter = require('./routes/mall')
app.use('/mall', mallRouter)
3.3、错误处理中间件
顾名思义,它是指当我们匹配不到路由时所执行的操作。错误处理中间件和其他中间件基本一样,只不过其需要开发者提供4个自变量参数。
app.use((err, req, res, next) => {
res.sendStatus(err.httpStatusCode).json(err);
});
一般情况下,我们把错误处理放在最下面,这样我们即可对错误进行集中处理。
const express=require("express");
var app=express();
app.get("/",function(req,res,next){
const err=new Error('Not Found');
res.send("主页");
next(err);
});
app.use("/user",function(err,req,res,next){
console.log("用户登录");
next(err);
},function(req,res,next){
res.send("用户登录");
next();
});
app.use(function(req,res){
res.status(404).send("未找到指定页面");
});
app.listen(8080);
3.4、内置中间件
从版本4.x开始,Express不再依赖Content,也就是说Express以前的内置中间件作为单独模块,express.static
是Express的唯一内置中间件。
express.static(root, [options]);
通过express.static
我们可以指定要加载的静态资源。
3.5、第三方中间件
形如之前我们的body-parser,采用引入外部模块的方式来获得更多的应用操作。如后期的cookie和session。
var express = require('express');
var app = express();
var cookieParser = require('cookie-parser');
本文地址:https://blog.csdn.net/pig_is_duck/article/details/107489034