中间件

  客户端的请求到达服务器时,他的生命周期是: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()
})
}

nodejs(12)Express 中间件middleware的更多相关文章

  1. nodejs之express中间件路由使用

    1.express 中间件使用 /* * 中间件:就是匹配路由之前和匹配路由之后做的一系列操作 */ var express = require('express'); var app = new e ...

  2. nodejs之express中间件cookie-parser使用

    知识点: * .domain的使用,.aaa.com的域名都共享这个cookie信息 * res.cookie(,domain:'.aaa.com'}); * .获取所有cookie,设置cookie ...

  3. nodeJs,Express中间件是什么与常见中间件

    中间件的功能和分类 中间件的本质就是一个函数,在收到请求和返回相应的过程中做一些我们想做的事情.Express文档中对它的作用是这么描述的: 执行任何代码.修改请求和响应对象.终结请求-响应循环.调用 ...

  4. nodejs之express中间件body-parser使用

    1.安装express和body-parser npm install express npm install body-parser 2‘.案例如下 var express = require('e ...

  5. 77.深入理解nodejs中Express的中间件

    转自:https://blog.csdn.net/huang100qi/article/details/80220012 Express是一个基于Node.js平台的web应用开发框架,在Node.j ...

  6. 【nodejs原理&源码赏析(1)】Express中间件系统的基本实现

    一直觉得express的中间件系统这种流式处理非常形象,就好像加工流水线一样,每个环节都在针对同一个产品的不同部分完成自己的工作,最后得到一个成品.今天就来实现一个简易的[中间件队列]. 一. API ...

  7. express中的中间件(middleware)、自定义中间件、静态文件中间件、路由中间件

    express文档地址 什么是中间件呢(middleware)?它是谁的中间件呢? 首先我们需要了解到请求和响应, 请求就是客户端发送请求给服务器, 响应就是,服务器根据客户端的请求返回给客户端的数据 ...

  8. nodejs之express的中间件

    express中间件分成三种 内置中间件 static 自定义中间件 第三方中间件 (body-parser) (拦截器) 全局自定义中间件 在请求接口时 有几个接口都要验证传来的内容是否存在或者是否 ...

  9. nodejs之express的使用

    Express是目前最流行的基于Node.js的Web开发框架,可以快速的搭建一个完整功能的网站. Express框架建立在内置的http模块上,http模块生成服务器的原始代码如下. var htt ...

随机推荐

  1. 拼接 字典序min

    给定一个字符串类型的数组strs,找到一种拼接方式,使得把所有字符串拼起来之后形成的字符串具有最低的字典序. 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个 ...

  2. 吴裕雄--天生自然TensorFlow2教程:链式法则

    import tensorflow as tf x = tf.constant(1.) w1 = tf.constant(2.) b1 = tf.constant(1.) w2 = tf.consta ...

  3. maven项目pom继承关系

    <dependency>部分下添加<exclusions>标记 Dependencies:是可选依赖(Optional Dependencies) Exclusions:是依赖 ...

  4. Cisco AP-Regulatory Domain

    这一note主要解释Regulatory Domain是什么.以较新的思科AP的型号举例,思科AP的PID一般都是按照如下的命名: AIR-AP3802I-H-K9C 按照自己的理解: AIR:其中的 ...

  5. 阿里云虚拟主机申请免费SSL证书并成功开通Https访问

    参考文档网址  https://baijiahao.baidu.com/s?id=1628343140232374972&wfr=spider&for=pc

  6. 洛谷P1086花生采摘(简单模拟)

    题目描述 鲁宾逊先生有一只宠物猴,名叫多多.这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!――熊字”. 鲁宾逊先生和多多都很开心,因为花生正是他 ...

  7. Nginx企业级优化!(重点)

    隐藏Nginx版本号!(重点) 在生产环境中,需要隐藏 Nginx 的版本号,以避免安全漏洞的泄漏 一旦有黑客知道Nginx版本号便可以利用Nginx漏洞进行攻击,严重影响到了公司的安全 查看隐藏版本 ...

  8. Educational Codeforces Round 81 + Gym 102267

    UPD:变色了!!!历史最高1618~ Educational Codeforces Round 81 (Rated for Div. 2) The 2019 University of Jordan ...

  9. Python 的直接赋值、Deepcopy、Copy的区别

    直接赋值: 其实就是对象的引用 浅拷贝(copy): 只拷贝符对象,不会拷贝对象内部的子对象 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象 有图有 ...

  10. ES的基本概念

    elasticsearch 的索引与文档是开发关注的视角:节点.集群.分片是运维关注的视角 elasticearch 文档的介绍 - elasticearch 是面向文档的,文档是所有可搜索数据的最小 ...