express中间件里面如何进行异步操作?
先接触的koa,知道koa中间件是个async function,所以在中间件里面进行像fs.readFile这类异步操作的的时候可以把他转化成promise。 但是在express中间件并不是aysnc function啊,它如何进行上面的操作。(node新手,望有错勿喷)
13 回复
@lovegnep 也就是说中间件可以这么写?
app.use((req, res, next) => {
Promse.resolve(1).then(() => {
next();
})
})
app.get('/', (req, res) => {
res.send('hello ,word')
})
express 中间件使用 async 函数其实是会有问题的,因为 express 的中间件执行是同步的 while 循环,当中间件中同时包含 普通函数 和 async 函数 时,执行顺序会打乱,先看这样一个例子:
function a() {
console.log('a')
}
async function b() {
console.log('b')
await 1
console.log('c')
await 2
console.log('d')
}
function f() {
a()
b()
console.log('f')
}
这里的输出是 'a' > 'b' > 'f' > 'c'
在普通函数中直接调用async函数, async 函数会同步执行到第一个 await 后的代码,然后就立即返回一个promise, 等到内部所有 await 的异步完成,整个async函数执行完,promise 才会resolve掉.
所以,如果用async函数做中间件,内部用await做异步处理,那么后面的中间件会先执行,等到 await 后再次调用 next 索引就会超出!,大家可以自己在这里 express async 打开注释,自己尝试一下。
具体内容欢迎阅读我的一篇博客 redux, koa, express 中间件实现对比解析