先接触的koa,知道koa中间件是个async function,所以在中间件里面进行像fs.readFile这类异步操作的的时候可以把他转化成promise。 但是在express中间件并不是aysnc function啊,它如何进行上面的操作。(node新手,望有错勿喷)
回调或者promise
来自酷炫的 CNodeMD
自己加就
app.use(async () => { const b = await **** do anything with b })
@lovegnep 也就是说中间件可以这么写?
app.use((req, res, next) => {
Promse.resolve(1).then(() => {
next();
})
})
app.get('/', (req, res) => {
res.send('hello ,word')
})
@LeoChowChina 再express中间件可以直接用async函数?
@JeffWong16 可以呀。
来自酷炫的 CNodeMD
@JeffWong16 是的。可以的
@JeffWong16 如果没有next,他不会进入下一个的
async 只要是node8+以上的版本都支持的,跟框架没有关系
@LeoChowChina 好的,非常感谢
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 中间件实现对比解析
@nanjixiong218 听不懂。不调用 next 方法的话,后面的中间件又怎么会执行呢。你举的例子跟 express 的执行顺序根本不是一回事。
我记得是 7.6 版本以上吧, next 就是调下个中间件。 await 是 await。 写俩 demo 记住就行了
@jamieYou 我要说明的问题是 express中使用async会存在问题,以及为什么会存在问题,并没有说express的执行顺序