express的middleware函数app.use()
express API: https://expressjs.com/en/api.html
app.use([path,] callback [, callback...])
- path的缺省值是"/"
其定义和app.METHOD是一样的,他们的差别主要是:
- use()的path是前缀匹配,而METHOD()的path的全路径匹配,例如一个请求路径/hello/hello2会匹配上use("/hello", ...),但不会匹配上METHOD("/hello", ...)
注意不管是use()还是METHOD()他们的调用顺序都是和申明的先后顺序一致,而和是use()的callback还是METHOD()的callback无关,从这一点上说use()和METHOD()也没有区别。
所以总结起来:
- 一个request是有一系列的callback组成。
- 这些callback可能是app.use(),或者是app.METHOD(),顺序安装申明的先后。
- 一个callback函数的next()函数,会触发callback链的下一个callback函数被调用
3.1 如果一个callback函数的next()函数没有被调用,那么后续的所有callback都不会被调用了,相当于request结束了。 - 一个callback函数的res.end()类函数会直接返回结果给client,client会认为请求完成返回。
4.1 自然的后面callback的res.end()类函数会无效,因为client自从收到第一个res.end()函数就认为调用已返回,链接甚至都断开了。
4.2 如果没有任何一个callback调用res.end()类函数,client会挂起一直等待,即使所有的callback函数已经完成。
举一个例子:
const express = require('express');
const app = express();
app.all('/hello', function (req, res, next) {
console.log('all 1-1')
next()
console.log('all 1-2')
})
app.all('/hello', function (req, res, next) {
console.log('all 2-1')
next()
console.log('all 2-2')
})
app.use('/hello', function (req, res, next) {
console.log('use 1-1')
next()
res.end()
console.log('use 1-2')
})
app.use('/hello', function (req, res, next) {
console.log('use 2-1')
next()
res.end()
console.log('use 2-2')
})
app.listen(8080, () => {
console.log(`Server running at: http://localhost:8080/`);
});
运行结果:
all 1-1
all 2-1
use 1-1
use 2-1
use 2-2
use 1-2
all 2-2
all 1-2
网友评论