CNode

express中间件里面如何进行异步操作?

问答
JJeffWong16发布于8 年前最后回复8 年前13 回复9321 浏览0 收藏

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

查看回复

回复 (13)

L
lovegnep#1·8 年前

回调或者promise

来自酷炫的 CNodeMD

L
LeoChowChina#2·8 年前

自己加就

app.use(async () => { const b = await **** do anything with b })

J
JeffWong16#3·8 年前
引用 lovegnep回调或者promise 来自酷炫的 CNodeMD

@lovegnep 也就是说中间件可以这么写?

app.use((req, res, next) => {
	
	Promse.resolve(1).then(() => {
		next();
	})
})

app.get('/',  (req, res) => {
	res.send('hello ,word')
})
J
JeffWong16#4·8 年前
引用 LeoChowChina自己加就 app.use(async () = { const b = await do anything with b })

@LeoChowChina 再express中间件可以直接用async函数?

L
lovegnep#5·8 年前
引用 JeffWong16@lovegnep 也就是说中间件可以这么写?

@JeffWong16 可以呀。

来自酷炫的 CNodeMD

L
LeoChowChina#6·8 年前

@JeffWong16 是的。可以的

L
LeoChowChina#7·8 年前

@JeffWong16 如果没有next,他不会进入下一个的

P
peasonlee#8·8 年前

async 只要是node8+以上的版本都支持的,跟框架没有关系

J
JeffWong16#9·8 年前
N
nanjixiong218#10·8 年前
引用 jamieYou@nanjixiong218 听不懂。不调用 next 方法的话,后面的中间件又怎么会执行呢。你举的例子跟 express 的执行顺序根本不是一回事。

@jamieYou 我要说明的问题是 express中使用async会存在问题,以及为什么会存在问题,并没有说express的执行顺序

N
nanjixiong218#11·8 年前

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 中间件实现对比解析

J
jamieYou#12·8 年前
引用 nanjixiong218express 中间件使用 async 函数其实是会有问题的,因为 express 的中间件执行是同步的 while 循环,当中间件中同时包含 普通函数 和 async 函数 时,执行顺序会打...

@nanjixiong218 听不懂。不调用 next 方法的话,后面的中间件又怎么会执行呢。你举的例子跟 express 的执行顺序根本不是一回事。

L
liangtongzhuo#13·8 年前

我记得是 7.6 版本以上吧, next 就是调下个中间件。 await 是 await。 写俩 demo 记住就行了

参与回复
登录后即可参与回复。登录