中间件
客户端的请求到达服务器时,他的生命周期是:request -- 服务器端处理 -- 响应
在服务器端处理过程中,业务逻辑复杂时,为了便于开发维护,需要把处理的事情分成几步,这里每一步就是一个中间件,数据就是中间件的操作对象。
注意:中间件方法中的三个参数:
-
req:请求对象;
-
res:响应对象;
-
next:next是一个函数,next()可以被调用,表示调用下一个中间件方法;
function(req,res,next){ //...我们自己的逻辑 next(); }
app.use(myrFunc) 要写在下面两句的前面
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
是因为路由后或请求静态资源后,一次请求响应的生命周期实质上已经结束,加在这后面进行请求处理,没有任何意义。
app.use()就是加载中间件的
测试:
const express = require('express') const app = express() // 创建第一个中间件 app.use(function(req, res, next) { console.log('第一个中间件') req.a = 'aaa' next() }) // 创建第二个中间件 不写 next(),那么后面注册的函数就不会执行, app.use(function(req, res, next) { console.log('第二个中间件') res.b = 'bbb' next() }) // 创建第三个中间件 app.use(function(req, res, next) { console.log('第三个中间件') console.log(req.a) console.log(res.b) // 结束中间件的调用 res.send('结束中间件的调用') }) app.listen(3001, function() { console.log('Express server is running at http://127.0.0.1:3001') })
Express 框架中对中间件的5种分类
-
应用级别的中间件: 挂载到 app 上的中间件
app.get('URL地址', (req, res, next)=> {})
; -
路由级别的中间件: 挂载到 router 对象上的中间件
router.get('url地址', (req, res, next)=>{})
-
错误级别的中间件: 回调函数中,有四个参数
app.use((err, req, res, next)=>{})
-
唯一内置的中间件:
express.static()
-
第三方中间件:
const express = require('express') const app = express() // 导入解析表单数据的中间件 const bodyParser = require('body-parser') // 把导入的第三方中间安装到app身上 app.use(bodyParser.urlencoded({extended: false })) // app.use 就是注册安装中间件 app.post('/adduser', (req, res) => { // req.body 上存放的,就是通过 body-parser 解析出来的表单数据 res.json(req.body) }) app.listen(3001, function() { console.log('Express server is running at http://127.0.0.1:3001') })
自己模拟中间件
const express = require('express') const app = express() const myBodyparse = require('./04myBodyparse') // 专门定义一个解析表单数据的中间件 app.use(myBodyparse) app.post('/adduser', (req, res) => { res.send(req.body) }) app.post('/updateuser', (req, res) => { res.send(req.body) }) app.listen(3001, function() { console.log('Express server is running at http://127.0.0.1:3001') })
04myBodyparse.js
const qs = require('querystring') module.exports = function(req, res, next) { let dtStr = '' // 只要有数据到达服务器,就会触发 data req.on('data', chunk => { dtStr += chunk }) // 只要触发了 end 事件,就证明数据发送和接收完毕了 req.on('end', () => { const result = qs.parse(dtStr) req.body = result console.log(req.body) next() }) }