本文已参与[新人创作礼]活动, 一起开启掘金创作之路。
前言
Express 是一个路由和中间件 Web 框架,它本身的功能很少.
Express 应用程序本质上是一系列中间件函数调用。
是的,你没有看错,Express应用程序本质上是一系列中间件函数调用,
包括我们前面学的路由,也是中间件的一种 —— 路由级中间件
Express的中间件有以下五种分类:
官方解释
中间件函数是有权访问
应用程序 请求-响应周期 中的request()、response() 和 下一个中间件函数 的函数。
下一个中间件函数通常由名为 的变量表示。req``res``next
中间件函数可以执行以下任务:
- 执行任何代码。
- 对请求和响应对象进行更改。
- 结束请求-响应周期。
- 调用堆栈中的下一个中间件函数。
用人话通俗讲
你可能看不懂官方的解说,但是没事,且听作者我为你娓娓道来:
(我也是看黑马视频学的)
形象理解
这个中间件啊,就像污水厂处理的一道道工序
在处理污水的时候,一般都要经过三个处理环节,从而保证处理过后的废水,达到排放标准。
而处理污水的这几个中间处理环节,就可以叫做中间件。
抽象理解
形象的理解后,我们再升华一下,抽象点理解就是
当一个请求到达 Express 的服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理。
五种 中间件 的定义
一个合格的中间件应当长这样:
function (req, res, next) {
// 此处是函数体,做你的逻辑处理
······
// 最后调用next方法
next()
})
其中next()是实现多个中间件连续调用的关键,它表示把流转关系转交给下一个中间件。
Express的中间件有以下五种分类:
(作者我暂时还不会markdown文章内设置链接跳转标题)
应用级别中间件
什么是应用级别中间件,官方的解释是这样的:
Bind application-level middleware to an instance of the app object by using the and functions, where is the HTTP method of the request that the middleware function handles (such as GET, PUT, or POST) in lowercase.
app.use()``app.METHOD()``METHODThis example shows a middleware function with no mount path. The function is executed every time the app receives a request.
var express = require('express')
var app = express()
app.use(function (req, res, next) {
console.log('Time:', Date.now())
next()
})
不知道各位有没有看懂
反正我百度翻译后也不是很懂,机翻不靠谱
最后看了黑马的教学才有点理解
浅浅翻译成 俗话理解:
应用级中间件 她就是绑定到express实例对象的函数:通过
app.use(中间件函数)绑定 。同时这个中间件必须要有next参数,且在方法体结尾调用了next()
提升
如果要为这个中间件设置请求路径,可以这样操作:
app.use('/user/:id', function (req, res, next) {
console.log('Request Type:', req.method)
next()
})
路由级中间件
路由器级中间件的工作方式与应用程序级中间件相同,
只是它绑定到的 实例是 express.Router()
演示一下 路由级中间件
var express = require('express')
var app = express()
var router = express.Router()
router.use(function (req, res, next) {
console.log('Time:', Date.now())
next()
})
app.use('/',router)
当然,用express实例对象进行 app.get()或者app.post()这种,也叫做路由级中间件
app.get('/user/:id', function (req, res, next) {
res.send(req.params.id)
})
错误级中间件
错误处理中间件 比较特别
因为相比起其他中间件只有三个(req.res.next)参数,她要多一个err参数
之所以错误处理中间件必须要有四个参数(errreq,res,next),官方是这样解释的:
错误处理中间件始终采用四个参数。您必须提供四个参数以将其标识为错误处理中间件函数。即使不需要使用对象,也必须指定它以维护签名。否则,该对象将被解释为常规中间件,并且将无法处理错误。
想想也是,毕竟是做错误处理的中间件,你做错误处理,当然要捕获错误对象。
那么一个错误级中间件应该如何定义呢?
请看:
app.use(function (err, req, res, next) {
console.error(err.stack)
res.status(500).send('Something broke!')
})
内置级中间件
说到这个,诶嘿嘿,这个可是咱们老熟人了
我们前期有用过一个static来挂载静态资源,实现web静态资源服务器
效果嘎嘎滴好
其实她就是属于内置级别中间件
回温一下代码:
const express = require('express')
const app = express()
app.use(express.static('public/dist'))
app.listen(80, () => {
console.log('express server running at http://192.168.123.53:80')
})
内置级中间件有:
- express.static 提供静态资产,如 HTML 文件、图像等。
- express.urlencoded 这个可以解开url编码的数据。还原成原始内容,post数据就是url加密的
第三方中间件
这个咱们也接触过,在前面一期 nodeJS express路由学习 以及req.body req.query方法详解 - 掘金 (juejin.cn) 里面介绍过
那时候,为了获取post传递过来的数据
我们npm下载安装了一个body-parser中间件
具体是这样做的:
npm install body-parser
//对body-parser进行配置
const bodyParser = require('body-parser');
//设置完毕之后,会在req对象上面新增一个req.body的一个对象
app.use( bodyParser.urlencoded({extended: true}) )
可以看到,一样需要用expree实例对象app 进行 app.use()来注册。
再举一个完整的栗子:
使用第三方中间件向 Express 应用添加功能。
安装所需功能的 Node.js 模块,然后在应用程序级别或路由器级别将其加载到应用程序中。
以下示例说明了如何安装和加载 Cookie 解析中间件函数。cookie-parser
$ npm install cookie-parser
var express = require('express')
var app = express()
var cookieParser = require('cookie-parser')
// load the cookie-parsing middleware
app.use(cookieParser())