NodeJs Express中间件使用流程解析

目录
  • 1、调用流程
  • 2、格式
  • 3、next函数的作用
  • 4、定义中间件函数
  • 5、全局生效的中间件
  • 6、中间件的作用
  • 7、定义多个全局中间件
  • 8、局部生效的中间件
  • 9、定义多个局部中间件
  • 10、了解中间件的注意事项
  • 11、中间件的分类
    • 1、应用级别的中间件
    • 2、路由级别的中间件
    • 3、错误级别的中间件
    • 4、Express内置的中间件
    • 5、第三方中间件
    • 6、自定义中间件

中间件(Middleware),特指业务流程的中间处理环节

1、调用流程

当一个请求到达Express的服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理。

2、格式

Express的中间件,本质上就是一个function处理函数,Express中间件的格式如下:

app.get('/',(req,res,next) => {
	next()
})

中间件的形参列表中,必须包含next参数,而路由处理函数只包含 req 和 res

3、next函数的作用

next函数是实现多个中间件连续调用的关键,它表示把流转关系转交给下一个中间件或路由

4、定义中间件函数

const vm = function(req,res,next) {
  console.log('这是最简单的中间件函数');
  // 把流转关系转交给下一个中间件或路由
  next()
}

5、全局生效的中间件

客户端发起的任何请求,到达服务器之后,都会触发的中间件

通过app.use(中间件函数),即可定义一个全局生效的中间件

const vm = function(req,res,next) {
  console.log('这是最简单的中间件函数');
  // 把流转关系转交给下一个中间件或路由
  next()
}
app.use(vm)

6、中间件的作用

多个中间件之间共享一份reqres。可以在上游的中间件中,统一为 req 或 res 对象添加自定义的属性或方法,供下游的中间件或路由进行使用。

7、定义多个全局中间件

可以使用app.use()连续定义多个全局中间件。客户请求到达服务器之后,会按照中间件定义的先后顺序依次进行调用

app.use(function(req,res,next) {
  console.log('调用了第一个中间件');
  next()
})
app.use(function(req,res,next) {
  console.log('调用了第二个中间件');
  next()
})
app.get('/',(req,res) => {
  res.send('OK.')
})

当请求http://127.0.0.1/

8、局部生效的中间件

不使用 app.use()定义的中间件为局部生效的中间件

const vm = function(req,res,next) {
  console.log('调用了局部生效的中间件');
  next()
}
app.get('/',vm,(req,res) => {
  res.send('Home Page.')
})
app.get('/user',vm,(req,res) => {
  res.send('User Page.')
})

vm中间件只会在/路由中生效,不会影响其他的路由。当请求http://127.0.0.1/时控制台有打印,请求http://127.0.0.1/user时,控制台没有打印。

9、定义多个局部中间件

app.get('/',mw1,mw2,(req,res) => {})
app.get('/',[mw1,mw2],(req,res) => {})

如上两种写法是等价的

10、了解中间件的注意事项

① 一定要在路由之前注册中间件

② 客户端发过来的请求,可以连续调用多个中间件进行处理

③ 执行完中间件的业务代码之后,要调用 next() 函数

④ 为了防止代码逻辑混乱,调用 next() 函数后不要再写额外的代码

⑤ 连续调用多个中间件时,多个中间件之间共享 req 和 res 对象

11、中间件的分类

1、应用级别的中间件

通过 app.use() 或 app.get() 或 app.post(),绑定到 app 实例上的中间件

2、路由级别的中间件

绑定到 express.Router()路由实例上的中间件

var app = express()
var router = express.Router()
router.use(function(req,res,next) {})

3、错误级别的中间件

专门用来捕获整个项目中发生的异常信息,从而防止项目异常崩溃的问题

格式:function处理函数中,必须有4个形参,从前到后分别是(err、req、res、next)

app.get('/',(req,res) => {
	throw new Error('服务器内部发生了错误!')
	res.send('Home Page.')
})

此时通过http://127.0.0.1/访问服务器,服务器就发生了崩溃

// 定义错误级别的中间件捕获整个项目的异常错误,从而防止程序的崩溃
app.use((err,req,res,next) => {
	res.send('Error:' + err.message)
})

此时通过http://127.0.0.1/访问服务器,服务器虽然发生了错误,但是没有崩溃

注意:错误级别的中间件必须注册在所有路由之后

4、Express内置的中间件

自 Express 4.16.0 版本开始,Express内置了3个常用的中间件,极大的提高了Express项目的开发效率和体验

express.static

快速托管静态资源的内置中间件,例如:HTML文件、图片、CSS样式等(无兼容性)

express.json

解析 JSON 格式的请求体数据(有兼容性,仅在 4.16.0+版本中可用)

app.post('/user',(req,res) => {
	// 通过 req.body 来接收客户端发送过来的请求体数据
	console.log(req.body)
	res.send('ok')
})

访问 http://127.0.0.1/user,并使用post请求发送JSON格式的参数,如 {"name":"zs","age":18}

如上打印 req.body 值为 undefined

app.use(express.json())
app.post('/user',(req,res) => {
	console.log(req.body)
	res.send('ok')
})

配置了解析JSON格式的请求体数据的中间件,打印 req.body 值为 {name:'zs',age:'18'}

express.urlencoded

解析 URL-encoded 格式的请求体数据(有兼容性,仅在 4.16.0+版本中可用)

app.post('/user',(req,res) => {
	console.log(req.body)
	res.send('ok')
})

访问 http://127.0.0.1/user,并使用post请求发送x-www-form-urlencoded格式的参数,如 key:name,value:zskey:age,value:18,如上打印 req.body 值为 undefined

app.use(express.json())
app.post('/user',(req,res) => {
	console.log(req.body)
	res.send('ok')
})

配置的是解析JSON格式的请求体数据的中间件,打印 req.body 值为 {}

app.use(express.urlencoded({extended:false}))
app.post('/user',(req,res) => {
	console.log(req.body)
	res.send('ok')
})

配置了解析表单中 urlencoded 格式的请求体数据的中间件,打印 req.body 值为 {name:'zs',age:'18'}

5、第三方中间件

非 Express 官方内置的,而是由第三方开发出来的中间件为第三方中间件。可以按需下载并配置,从而提高项目的开发效率

body-parser这个第三方中间件用来解析请求体数据

① 运行 npm i body-parser

② 使用 require导入中间件

③ 调用app.use()注册并使用中间件

const parser = require('body-parser')
app.use(parser.urlencoded({extended:false}))

注意:Express内置的express.urlencoded中间件,就是基于body-parser这个第三方中间件进一步封装出来的

6、自定义中间件

手动模拟一个类似于 express.urlencoded 的中间件,来解析POST提交到服务器的表单数据

① 定义中间件

② 监听 req 的 data 事件

③ 监听 req 的 end 事件

④ 使用 querystring 模块解析请求体数据

⑤ 将解析出来的数据对象挂载为 req.body

⑥ 将自定义中间件封装为模块

1、定义中间件

app.use((req,res,next) => {<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->})

2、监听 req 的 data 事件

监听 req 对象的 data 事件来获取客户端发送到服务器的数据。

如果数据量比较大无法一次性发送完毕,则客户端会把数据切割后分批发送到服务器,每次触发 data 事件获取到的数据只是完整数据的一部分,需要手动对接收的数据进行拼接

app.use((req,res,next) => {
  // 1. 定义一个变量,专门用来存储客户端发送过来的请求体数据
  let str = ''
  // 2. 监听req的data事件
  req.on('data',(chunk) => {
    str += chunk
  })
})

3、监听 req 的 end 事件

当请求体数据接收完毕之后,会自动触发 req 的 end 事件

app.use((req,res,next) => {
  let str = ''
  req.on('data',(chunk) => {
    str += chunk
  })
  // 3.监听req的end事件
  req.on('end',() => {
    // 在str中存放的是完整的请求体数据
    console.log(str);
  })
})

得到的值为:name=zs&age=18&gender=%E7%94%B7

4、使用 querystring 模块解析请求体数据

Node.js 内置了一个 querystring 模块,专门用来处理查询字符串。通过这个模块提供的 parse() 函数,可以把查询字符串解析成对象的格式

const qs = require('querystring')
app.use((req,res,next) => {
  let str = ''
  req.on('data',(chunk) => {
    str += chunk
  })
  req.on('end',() => {
    // 4.把字符串格式的请求体数据解析成对象格式
    const body = qs.parse(str)
    console.log(body)
  })
})

得到的值为:{ name: 'zs', age: '18', gender: '男' }

5、将解析出来的数据对象挂载为 req.body

上游的中间件和下游的中间件及路由之间共享同一份 reqres。因此可以将解析出来的数据挂载为 req 的自定义属性,命名为 req.body 供下游使用

const qs = require('querystring')
app.use((req,res,next) => {
  let str = ''
  req.on('data',(chunk) => {
    str += chunk
  })
  req.on('end',() => {
    const body = qs.parse(str)
    // 5. 将解析出来的请求体对象挂载为 req.body 属性,最后要调用 next() 函数执行后续的业务逻辑
    req.body = body
    next()
  })
})

6、将自定义中间件封装为模块

把自定义的中间件函数封装为独立的模块 custom-body-parser.js

const qs = require('querystring')
const bodyParser = function(req,res,next) {
  let str = ''
  req.on('data',(chunk) => {
    str += chunk
  })
  req.on('end',() => {
    const body = qs.parse(str)
    req.body = body
    next()
  })
}
module.exports = bodyParser

使用:

// 导入自己封装的中间件模块
const customBodyParser = require('./custom-body-parser')
// 将自定义的中间件函数注册为全局可用的中间件
app.use(customBodyParser)

到此这篇关于NodeJs Express中间件使用流程解析的文章就介绍到这了,更多相关NodeJs Express中间件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • NodeJs Express中间件超详细讲解

    目录 什么是中间件 现实生活中的例子 Express 中间件的调用流程 Express 中间件的格式 next 函数的作用 定义中间件函数 全局生效的中间件 定义全局中间件的简化形式 中间件的作用 定义多个全局中间件 局部生效的中间件 定义多个局部中间件 了解中间件的5个使用注意事项 中间件的分类 应用级别的中间件 路由级别的中间件 错误级别的中间件 Express内置的中间件 第三方的中间件 自定义中间件 1. 需求描述与实现步骤 2. 定义中间件 3 .监听req的data事件 4. 监听r

  • nodejs开发——express路由与中间件

    路由 通常HTTP URL的格式是这样的: http://host[:port][path] http表示协议. host表示主机. port为端口,可选字段,不提供时默认为80. path指定请求资源的URI(Uniform Resource Identifier,统一资源定位符),如果URL中没有给出path,一般会默认成"/"(通常由浏览器或其它HTTP客户端完成补充上). 所谓路由,就是如何处理HTTP请求中的路径部分.比如"http://xxx.com/users/

  • 前端需知nodejs express中间件使用及定义详解

    目录 引言 中间件的定义 中间件的使用 总结 引言 在上一节中我们简单了解了express的路由,本文主要分析下express的另一个核心功能中间件的使用.路由是express整个框架能有如今广泛使用和发展的基础,那中间件就是其发展的养分.正是express丰富的中间件才节省了我们大量的开发时间. 中间件的定义 对于express来说,中间件其实就是一个规定了入参和出参的JavaScript函数,这个函数可以处理请求request和返回response相关的参数,其功能如下: 执行任何代码. 处

  • Nodejs之Express中间件的分类介绍

    目录 中间件的分类 分别是 1 应用级别的中间件 2 路由级别的中间件 3 错误级别的中间件 4 Express内置的中间件 5 第三方中间件 总结 中间件的分类 为了方便大家理解和记忆中间件的使用,Express官方把常见的中间件用法,分成了5大类 分别是 应用级别的中间件 路由级别的中间件 错误级别的中间件 Express内置的中间件 第三方的中间件 1 应用级别的中间件 通过app.use()或app.get()或app.post(),绑定到app实例上的中间件,叫做应用级别的中间件,代码

  • 深入理解nodejs中Express的中间件

    Express是一个基于Node.js平台的web应用开发框架,在Node.js基础之上扩展了web应用开发所需要的基础功能,从而使得我们开发Web应用更加方便.更加快捷. 举一个例子: 用node.js实现一个控制台打印"hello server" var http = require('http'); var server = http.createServer(function(req,res){ console.log("hello server"); })

  • Nodejs中Express 常用中间件 body-parser 实现解析

    写在前面 body-parser是非常常用的一个express中间件,作用是对post请求的请求体进行解析.使用非常简单,以下两行代码已经覆盖了大部分的使用场景. app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); 本文从简单的例子出发,探究body-parser的内部实现.至于body-parser如何使用,感兴趣的同学可以参考官方文档. 入门基础 在正式讲解前,我们先来看一个POST

  • NodeJs Express中间件使用流程解析

    目录 1.调用流程 2.格式 3.next函数的作用 4.定义中间件函数 5.全局生效的中间件 6.中间件的作用 7.定义多个全局中间件 8.局部生效的中间件 9.定义多个局部中间件 10.了解中间件的注意事项 11.中间件的分类 1.应用级别的中间件 2.路由级别的中间件 3.错误级别的中间件 4.Express内置的中间件 5.第三方中间件 6.自定义中间件 中间件(Middleware),特指业务流程的中间处理环节 1.调用流程 当一个请求到达Express的服务器之后,可以连续调用多个中

  • 浅谈redux, koa, express 中间件实现对比解析

    如果你有 express ,koa, redux 的使用经验,就会发现他们都有 中间件(middlewares)的概念,中间件 是一种拦截器的思想,用于在某个特定的输入输出之间添加一些额外处理,同时不影响原有操作. 最开始接触 中间件是在服务端使用 express 和 koa 的时候,后来从服务端延伸到前端,看到其在redux的设计中也得到的极大的发挥.中间件的设计思想也为许多框架带来了灵活而强大的扩展性. 本文主要对比redux, koa, express 的中间件实现,为了更直观,我会抽取出

  • nodejs关于中间件解析

    目录 nodejs 中间件 中间件的编写 中间件的使用 nodejs制作自定义中间件 总结 nodejs 中间件 今天我们来了解一下 nodejs 中间件,中间件可以说是 node 中最重要也是最核心的地方.它最重要的思想便是 洋葱模型 ,从外到内依次执行中间件. 说了半天中间件到底有什么作用呢,在处理服务请求时,我们要进行很多细节的处理,比如解析请求体,报文报头,设置 cookie 等等很多操作,如果每次访问路由都要编写这些繁琐的代码,将会造成代码混乱,你可能连自己的业务逻辑代码都找不到了.

  • NodeJS Express使用ORM模型访问关系型数据库流程详解

    目录 一.ORM模型 二.在Node中ORM的实现 一.ORM模型 设计思想,主要目的是简化计算机程序访问数据库 1.ORM:对象关系模型(对象关系映射) Object Releastion Model,将程序中的对象和数据库中关系(表格)进行映射.可以使开发者在程序中方便的对数据库进行操作(用户在程序操作对对象实际就是操作数据库的表格) 2.ORM的映射关系: (1)程序中的模型(即为类) <——>表名 (2)模型的类型(类中定义的属性)<——> 表的列 (3)由模型创建的对象(

  • 浅谈express 中间件机制及实现原理

    简介 中间件机制可以让我们在一个给定的流程中添加一个处理步骤,从而对这个流程的输入或者输出产生影响,或者产生一些中作用.状态,或者拦截这个流程.中间件机制和tomcat的过滤器类似,这两者都属于责任链模式的具体实现. express 中间件使用案例 let express = require('express') let app = express() //解析request 的body app.use(bodyParser.json()) //解析 cookie app.use(cookieP

  • NodeJs Express框架实现服务器接口详解

    目录 CORS 跨域资源共享 1. 接口的跨域问题 2. 使用 cors 中间件解决跨域问题 创建基本的服务器 创建 API 路由模块 编写 GET 接口 编写 POST 接口 注意:如果要获取 URL-encoded 格式的请求体数据,必须配置中间件 app.use(express.urlencoded({ extended: false })) CORS 跨域资源共享 1. 接口的跨域问题 <body> <button id="btnGET">GET<

  • Nodejs+express+html5 实现拖拽上传

    一.前言 文件上传是一个比较常见的功能,传统的选择方式的上传比较麻烦,需要先点击上传按钮,然后再找到文件的路径,然后上传.给用户体验带来很大问题.html5开始支持拖拽上传的需要的api.nodejs也是一个最近越来越流行的技术,这也是自己第一次接触nodejs,在nodejs开发中,最常用的开发框架之一是expess,它是一个类似mvc模式的框架.结合html5.nodejs express实现了拖拽上传的功能. 二.基础知识普及 1.NodeJs基础知识 nodejs简单来说就是一个可以让j

随机推荐