中间件

  客户端的请求到达服务器时,他的生命周期是:request -- 服务器端处理 -- 响应

  在服务器端处理过程中,业务逻辑复杂时,为了便于开发维护,需要把处理的事情分成几步,这里每一步就是一个中间件,数据就是中间件的操作对象。

定义:中间件就是一个处理函数;只不过这个函数比较特殊,包含了三个参数,分别是 reqresnext

注意:中间件方法中的三个参数:

  • 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()

  • 第三方中间件: 非express框架提供的,需要程序员手动安装才能使用的中间件;body-parser 解析post 表单数据

使用第三方body-parser

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()
})
}

最新文章

  1. html_01之基础标签
  2. 实现台式机redhat6.4无线网卡上网RTL8188CUS
  3. 软件设计之UML—UML中的六大关系
  4. 【转】为什么我要用 Node.js? 案例逐一介绍
  5. javascript面向对象和原型
  6. MVC自学系列之一(MVC入门篇)
  7. 常用的Linux操作二
  8. IoC容器Autofac之实例引入(一)
  9. 一起写框架-Ioc内核容器的实现-基础功能-ComponentScan支持多包扫描(六)
  10. arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-g++: Command not found 解决方法
  11. request拿各种东西
  12. 015-OC基础语法-OC笔记
  13. 从零开始学 Web 之 CSS(三)链接伪类、背景、行高、盒子模型、浮动
  14. java集合性能
  15. node错误中间件处理 express类 带有路由操作
  16. 2017-12-15python全栈9期第二天第七节之练习题
  17. u-boot移植(九)---代码修改---NAND
  18. spring使用中ModelAttribute的内容被覆盖
  19. SQLServer 在Visual Studio的2种连接方法
  20. 返回通知的方法 是void

热门文章

  1. 免费https/ssl通配证书(letsencrypt)安装
  2. Vue父组件主动获取子组件的数据和方法
  3. APDL获取节点和单元的结果
  4. JAVA面向对象解决实际问题实例(一)
  5. 七、SXSSFWorkbook生成大excle,避免内存溢出
  6. mysql字符串相关函数(并与sql server对比)
  7. 什么是 SDK?
  8. Solr搜索引擎服务器学习笔记
  9. Java基础知识笔记第四章:类和对象
  10. requests库 cookie和session