-
中间件定义
- 中间件是一个特殊的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,则整个请求都会在当前中间件卡住。
- 多个中间件先后顺序。
- 注意通过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(); // 四个接口的时候还可以,如果是大型项目,100个1000个呢 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); });
-
- 路由中间件,就可以优化这些.具体思路: 先拆开再合并
-
先分开在不同的文件夹中 -
合并在server.js中 -
// ./router/my/user.js const express = require('express'); const router = express.Router(); //路由方法 // 最终的路径为二合1的 router.get('/userinfo', function(req, res) { res.send('userinfo'); }); //自定义模块 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;
-
在server.js主文件合并
-
const express = require('express'); const app = express(); // 引入路径地址 const apiRouter = require('./router/api'); const categoryRouter = require('./router/my/category'); const userRouter = require('./router/my/user'); // 路由中间件 // 最终的路径地址 /api/login -- /api/reguser app.use('/api', apiRouter); // 最终的路径地址 /my/category/list app.use('/my/category', categoryRouter); // 最终的路径地址 /my/user/userinfo app.use('/my/user', userRouter); // 最初的地址文件 //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('express应用在3000端口启动了'); })
- 图示理解