express中间件里面如何进行异步操作?
发布于 7 年前 作者 JeffWong16 7765 次浏览 来自 问答

先接触的koa,知道koa中间件是个async function,所以在中间件里面进行像fs.readFile这类异步操作的的时候可以把他转化成promise。 但是在express中间件并不是aysnc function啊,它如何进行上面的操作。(node新手,望有错勿喷)

13 回复

回调或者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 如果没有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的执行顺序

回到顶部