先接触的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 可以呀。
@JeffWong16 是的。可以的
@JeffWong16 如果没有next,他不会进入下一个的
async 只要是node8+以上的版本都支持的,跟框架没有关系
@LeoChowChina 好的,非常感谢
express 中间件使用 async 函数其实是会有问题的,因为 express 的中间件执行是同步的 while 循环,当中间件中同时包含 普通函数 和 async 函数 时,执行顺序会打乱,先看这样一个例子:
express
async
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'
'a' > 'b' > 'f' > 'c'
在普通函数中直接调用async函数, async 函数会同步执行到第一个 await 后的代码,然后就立即返回一个promise, 等到内部所有 await 的异步完成,整个async函数执行完,promise 才会resolve掉.
await
promise
resolve
所以,如果用async函数做中间件,内部用await做异步处理,那么后面的中间件会先执行,等到 await 后再次调用 next 索引就会超出!,大家可以自己在这里 express async 打开注释,自己尝试一下。
next
具体内容欢迎阅读我的一篇博客 redux, koa, express 中间件实现对比解析
@nanjixiong218 听不懂。不调用 next 方法的话,后面的中间件又怎么会执行呢。你举的例子跟 express 的执行顺序根本不是一回事。
我记得是 7.6 版本以上吧, next 就是调下个中间件。 await 是 await。 写俩 demo 记住就行了
@jamieYou 我要说明的问题是 express中使用async会存在问题,以及为什么会存在问题,并没有说express的执行顺序
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
回调或者promise
来自酷炫的 CNodeMD
自己加就
app.use(async () => { const b = await **** do anything with b })
@lovegnep 也就是说中间件可以这么写?
@LeoChowChina 再express中间件可以直接用async函数?
@JeffWong16 可以呀。
来自酷炫的 CNodeMD
@JeffWong16 是的。可以的
@JeffWong16 如果没有next,他不会进入下一个的
async 只要是node8+以上的版本都支持的,跟框架没有关系
@LeoChowChina 好的,非常感谢
express中间件使用async函数其实是会有问题的,因为express的中间件执行是同步的while循环,当中间件中同时包含普通函数和async 函数时,执行顺序会打乱,先看这样一个例子:这里的输出是
'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的执行顺序