中间件是一个特殊的url地址处理函数,它被当作 app.use(中间件函数)
的参数或者是某个路由处理函数中使用。
-
中间件是 express 的最大特色,也是最重要的一个设计。
Express是一个自身功能极简,完全是路由和中间件构成一个web开发框架:从本质上来说,一个Express应用就是在调用各种中间件。
-
一个 express 应用,就是由许许多多的中间件来完成的
定义格式
// 具名函数格式:
const handler1 = (req, res, next) => {
console.log(Date.now());
next();
}
app.use(handler1);
// 匿名函数格式:
app.use((req, res, next) => {
console.log(Date.now());
next();
});
说明: 中间件函数中有三个基本参数, req、res、next
-
req就是请求相关的对象,它和下一个中间件函数中的req对象是一个对象
-
res就是响应相关的对象,它和下一个中间件函数中的res对象是一个对象
-
next:它是一个函数,调用它将会跳出当前的中间件函数,执行后续中间件;如果不调用next,也不执行res.end,则整个请求都会在当前中间件卡住。
const express = require('express')
const app = express();
app.use((req, res, next) => {
console.log("第1个中间件");
req.a1 = 100;
next();
});
app.use((req, res, next) => {
console.log("第2个中间件");
res.setHeader('content-type', 'text/html;charset=utf8');
res.a2 = 200;
next();
});
app.use((req, res, next) => {
console.log("第3个中间件");
req.a3 = 300;
console.log(req.a1,req.a2)
res.end('中间件');
});
app.listen(3000,()=>{
console.log('express应用在3000端口启动了');
})
-
多个中间件先后顺序。
-
注意通过req来附加额外的信息。
-
如果不用next(),则不会进入下一个中间件。
中间件-匹配路由
-
app.use(中间件)是应用级中间件,所有的请求都能匹配。
-
app.use('/apiname',中间件) 。匹配请求路径是/apiname的请求。
-
app.get('/apiname',中间件) 。匹配get类型并且请求路径是/apiname的请求,就是我们前面说的路由。
-
app.post('/apiname',中间件1,中间件2) 。一个路由中使用多个中间件。
路由中间件
接口数量较多时,这些接口如果全写在一个文件中,代码不好管理。
// server.js express项目的主文件
const express = require('express');
const app = express();
app.get('/my/category/list', (req, res) => { res.send('my/category/list') });
app.get('/my/user/userinfo', (req, res) => { res.send('my/user/userinfo') });
app.get('/api/login', (req, res) => { res.send('api/login') });
app.get('/api/reguser', (req, res) => { res.send('api/reguser') });
app.listen(3000, () => {
console.log(3000);
});
你可以脑补一下100个接口写在一个页面中的效果。
学习路由中间件,用它来优化我们的现在的写法。
思路:先拆后分
步骤
拆分
新建立router文件夹,来放置所有的路由文件
// ./router/my/user.js
const express = require('express');
const router = express.Router();
router.get('/userinfo', function(req, res) {
res.send('userinfo');
});
module.exports = router; // 模块导出
// ./router/my/category.js
const express = require('express');
const router = express.Router();
router.get('/list', function(req, res) {
res.send('list');
});
module.exports = router;
// ./router/api.js
const express = require('express');
const router = express.Router();
router.get('/login', function(req, res) {
res.send('login');
});
router.get('/reguser', function(req, res) {
res.send('reguser');
});
module.exports = router;
合并
在主入口文件中使用它们
const express = require('express');
const app = express();
const apiRouter = require('./router/api');
const categoryRouter = require('./router/my/category');
const userRouter = require('./router/my/user');
// 路由中间件
app.use('/api', apiRouter);
app.use('/my/category', categoryRouter);
app.use('/my/user', userRouter);
app.listen(3000,()=>{
console.log('express应用在3000端口启动了');
})