express 中间件
曾经被面试官问过express的中间件中,next是干嘛的,我没答出来,甚是尴尬,今天好好看了一番。
先看一个基本案例,打印结果为 1 3 2。
const express = require('express');
const app = express();
app.get('/*', (req, res, next) => {
console.log(`1`);
next();
console.log(`2`);
});
app.get('/a', (req, res, next) => {
console.log(3);
res.end('<h1>hello</h1>');
})
app.listen('3000');
next()
会暂停当前中间件的执行,去执行下一个中间件,如果一个中间件没有调用next()
,那么后续匹配的中间件也不会执行。后面的中间件执行完后,会像堆栈一样展开,继续执行前面中间件的还没执行完的部分,例如上面例子中的console.log(2)
。
在koa中也是类似的,只不过koa中要用异步函数await。
用一个中间件来计算一次响应的耗时
同一个面试官问的,当时也没答上来,太菜了。
思路很简单,为了不侵入业务代码,在最前面用一个中间件来接收所有请求,记录下开始时间,然后调用next()
,待后面的业务代码都执行完后,最后会来继续执行这个中间件,这时就可以计算耗时了,示例如下:
app.use((req, res, next) => {
const start = new Date().getTime();
next();
console.log(`耗时${new Date().getTime() - start}ms`);
})
一个可以运行的栗子:
const express = require('express');
const app = express();
app.use((req, res, next) => {
const start = new Date().getTime();
next();
console.log(`耗时${new Date().getTime() - start}ms`);
})
app.get('/a', (req, res, next) => {
res.end('<h1>hello</h1>');
})
app.listen('3000');