node中间件

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: node中间件

Express 的中间件

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

需要注意的是:中间件有三个参数。在中间件的形参列表中。
必须包含next参数;它既是参数也是函数。
其中路由处理函数中有req和res。
有的小伙伴可能会问呢?
我怎么知道是一个函数还是一个中间件。他们实在是长得太像了。
其实:我们可以通过第三个参数来判断是不是中间件。
next函数的作用
next 函数是实现多个中间件连续调用的关键,
它表示把流转关系转交给下一个中间件或路由。
我们可以理解为前端路由中路由守卫中的next。

中间件的调用流程

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

定义一个简单的中间件

// 常量 mw 所指向的,就是一个中间件函数
const mw = function (req, res, next) {
    console.log("我是一个中间件')
    // 注意: 在当前中间件的业务处理完毕后,必须调用 next() 函数
    // 表示把流转关系转交给下一个中间件或路由next()
}

注册一个全局生效的中间件

客户端发起的任何请求,到达服务器之后,都会触发的中间件,叫做全局生效的中间件。
expres中通过调用 app.use(中间件函数),即可定义一个全局生效的中间件,代码如下:
//常量 mw 所指向的,就是一个中间件函数
const mw = function (req, res, next) {
    console.log('这是一个最简单的中间件函数')
    next()
}
// 全局生效的中间件
app.use(mw)

调用请求接口,全局中间件被触发

const express = require("express");
const app = express();
//常量 mw 所指向的,就是一个中间件函数
const mw = function (req, res, next) {
    console.log('这是一个最简单的中间件函数,我将会被触发')
    next()
}
// 全局生效的中间件
app.use(mw)
// 监听客户端的get请求
app.get('/user', (req, res) => { 
    res.send({name:'张三',age:22, type:'admin'})
})
app.listen(3000, () => { 
    console.log('express serve Started successfully')
})

在浏览器中输入 http://127.0.0.1:3000/user 会触发中间件

需要注意中间件的一个顺序问题

如果我们把中间件放在路由的后面。
这样中间件会失效的。
因为代码从上往下执行。路由都执行完了。就不关中间件什么事情了。
像下面这一种:把中间件放在路由后面。中间件将不会被执行
app.get('/user', (req, res) => { 
    res.send({name:'张三',age:22, type:'admin'})
})
const mw = function (req, res, next) {
    console.log('这是一个最简单的中间件函数,我将会被触发')
    next()
}
app.use(mw)

定义多个全局中间件

我么可以使用 app.use()连续定义多个全局中间件。
就像之前定义多个静态服务一样。
客户端请求到达服务器之后,会按照中间件定义的先后顺序依次进行调用。
代码如下:
//常量 mw 所指向的,就是一个中间件函数
const mw1 = function (req, res, next) {
    console.log('我是第1个中间件')
    next()
}
const mw2 = function (req, res, next) {
    console.log('我是第2个中间件')
    next()
}
// 全局生效的中间件1
app.use(mw1)
// 全局生效的中间件2
app.use(mw2)

局部生效的中间件

有的小伙伴可能会问,上面是全局中间件。
有没有局部中间件呢?
有的! 局部中间件是这样定义的: 
不使用app.use()定义的中间件,叫做局部中间件。
也就是说:有app.use()的是全局中间件。没有app.use()定义的是局部中间件
const express = require("express");
const app = express();
//常量 mw1 所指向的,就是一个中间件函数
const mw1 = function (req, res, next) {
    console.log('我是局部生效的中间件')
    next()
}
// 监听客户端的get请求,局部中间件不会影响这个user请求
app.get('/user', (req, res) => { 
    res.send({name:'张三',age:22, type:'admin'})
})
// 当请求list的之后,这个中间件只会在list中生效
app.get('/list',mw1, (req, res) => { 
    res.send([{name:'张三',age:22, type:'admin'}])
})
app.listen(3000, () => { 
    console.log('express serve Started successfully')
})

04png

定义多个局部中间件

有些时候,我们针对某一个请求。
可能需要使用多个中间件。这个时候多个局部中间件就出场了。
下面是多个局部中间件的两种方式:
//定义了中间件mw1,mv2。使用逗号隔开:多个中间件
app.get('/list',mw1,mv2, (req, res) => { 
    res.send('我是list请求')
})
//定义了中间件mw1,mv2。把多个中间件放在一个数组中
app.get('/user',[mw1,mv2], (req, res) => { 
    res.send('我是list请求')
})

express 中间件的分类

Express 官方把常见的中间件用法,分成了 5 大类。
1.应用级别的中间件
2.路由级别的中间件
3.错误级别的中间件
4.Express 内置的中间件
5.第三方的中间件

应用级别的中间件

通过 app.use()或 app.get()或 app.post(),
绑定到 app 实例上的中间件,叫做应用级别的中间.
我们上面写的代码,就算是应用级别的中间件

路由级别的中间件

绑定到 express.Router()实例上的中间件,叫做路由级别的中间件。
它的用法和应用级别中间件没有任何区别。
只不过,应用级别中间件是绑定到 app 实例上.
路由级别中间件绑定到 router 实例上

错误级别的中间件

错误级别中间件的作用:专门用来捕获整个项目中发生的异常错误,
从而防止项目异常崩溃的问题。
下面我们抛出一个异常。
const express = require("express");
const app = express();
// 当请求 file 之后,虽然项目发生了错误,但是不会让项目崩掉
app.get('/file', (req, res) => { 
    res.send({info:'发生错误'})
    throw new Error('服务器咋开小差')
})
//这中间件在路由后面。
app.use((err,req,res,next) => { 
    console.log('发生了错误:', err)
    res.send('error:', err.message)
})
app.listen(3000, () => { 
    console.log('express serve Started successfully')
})

关于错误级别的中间件的特殊点

有的小伙伴看了上面的代码。发现很奇怪。
不是说的:
把中间件放在路由后面。中间件将不会被执行。
咋个还执行了呢?
因为:错误级别的中间件比较特殊。
必须注册在所有的路由之后。

Express 内置的中间件

自Express 4.16.0 版本开始,Express 内置了3 个常用的中间件.
1==> express.static 托管静态资源的内置中间件.
例如: HTML 文件、图片、CSS 样式等(无兼容性)
2==> express.json 解析JSON 格式的请求体数据 (有兼容性,仅在 4.16.0+ 版本中可用)
3==> express.urlencoded 解析 URL-encoded 格式的请求体数据(有兼容性,仅在 4.16.0+ 版本中可用)
// 配置解析 application/json 格式数据的内置中间件
app.use(express.json( ))
// 配置解析 application/x-w-form-urlencoded 格式数据的内置中间件
app.use(express.urlencoded({ extended: false }))

遇见问题,这是你成长的机会,如果你能够解决,这就是收获。

相关文章
|
2月前
|
Web App开发 JSON JavaScript
Node.js 中的中间件机制与 Express 应用
Node.js 中的中间件机制与 Express 应用
|
2月前
|
JavaScript 安全 中间件
深入浅出Node.js中间件机制
【10月更文挑战第36天】在探索Node.js的奥秘之旅中,中间件的概念如同魔法一般,它让复杂的请求处理变得优雅而高效。本文将带你领略这一机制的魅力,从概念到实践,一步步揭示如何利用中间件简化和增强你的应用。
|
2月前
|
消息中间件 JavaScript 中间件
深入浅出Node.js中间件机制
【10月更文挑战第24天】在Node.js的世界里,中间件如同厨房中的调料,为后端服务增添风味。本文将带你走进Node.js的中间件机制,从基础概念到实际应用,一探究竟。通过生动的比喻和直观的代码示例,我们将一起解锁中间件的奥秘,让你轻松成为后端料理高手。
39 1
|
3月前
|
JSON JavaScript 中间件
深入浅出Node.js中间件机制
本文将带你探索Node.js中一个核心概念——中间件机制。我们将通过浅显的语言和生动的比喻,揭示中间件如何作为请求和响应之间的“交通枢纽”,在应用程序中起到至关重要的作用。从基础原理到实际应用,你将了解到中间件不仅简化了代码结构,还提高了开发效率,是Node.js开发不可或缺的一部分。
62 1
|
3月前
|
JavaScript 安全 中间件
深入浅出Node.js中间件机制
【10月更文挑战第4天】在探索Node.js的海洋中,中间件机制犹如一座灯塔,为开发者指引方向。本文将带你一探究竟,从浅入深地理解这一核心概念。我们将通过生动的比喻和实际代码示例,揭示中间件如何在请求和响应之间搭建桥梁,实现功能的扩展与定制。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
63 0
|
4月前
|
JavaScript 前端开发 中间件
深入浅出Node.js中间件模式
【9月更文挑战第13天】本文将带你领略Node.js中间件模式的魅力,从概念到实战,一步步揭示如何利用这一强大工具简化和增强你的Web应用。我们将通过实际代码示例,展示中间件如何在不修改原有代码的情况下,为请求处理流程添加功能层。无论你是前端还是后端开发者,这篇文章都将为你打开一扇通往更高效、更可维护代码的大门。
|
5月前
|
JavaScript 中间件 开发者
深入浅出Node.js中间件机制
【8月更文挑战第31天】本文将带你领略Node.js中间件的奥秘,通过直观的案例分析,揭示其背后的设计哲学。你将学会如何运用中间件构建强大而灵活的后端应用,以及在面对复杂业务逻辑时如何保持代码的清晰与高效。
|
8月前
|
消息中间件 存储 负载均衡
消息中间件的选择:RabbitMQ是一个明智的选择
消息中间件的选择:RabbitMQ是一个明智的选择
120 0
|
7月前
|
消息中间件 存储 中间件
【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
1830 0
|
6月前
|
消息中间件 编解码 Docker
Docker部署RabbitMQ消息中间件
【7月更文挑战第4天】Docker部署RabbitMQ消息中间件
287 3