KOA / node.js 外部函数在回调完成之前响应
KOA / node.js outer function responds before callback finishes
首先,我对标题感到抱歉,我想不出更好的东西。
我以为我了解 Node.js / KOA,至少是基础知识,但现在我开始觉得我缺少一些基础知识。
看看下面的代码:
router.put("/",
parse,
async function (ctx, next) {
// do something
await next();
},
async function (ctx, next) {
// do something
await next();
},
async function (ctx, next) {
if (some condition) {
gm(imageBuffer)
.quality(80)
.write(profile_path, async function (err) {
gm(imageBuffer)
.resize(60, 60)
.quality(80)
.write(chat_path,async function (err) {
await next(); // HERE 1
});
});
} else {
await next();
}
// HERE 2
},
async function (ctx, next) {
responses.success(ctx, "Success");
}
);
这到底是怎么回事。熟悉 KOA 框架的人一眼就能看出这里是怎么回事。我的问题 starts/ends 在第三个 async function
中。所以我在这里要做的是一些图像处理(保存)。 gm 是异步的,但正如您从代码中看到的那样,我使用的是匿名回调函数,而我试图实现的是当 gm 通过 await next(); // HERE 1
完成时调用最后一个 async function
。
但真正发生的是(根据我的理解)...gm 异步启动..并且 // HERE 2
被命中,并且因为什么都没有,函数结束,KOA returns 默认 404回复。我根本不明白为什么会这样以及如何克服这个问题。
我真正想要发生的是当回调完成时 await next(); // HERE 1
被调用并且我可以 return 成功响应。
await next(); // HERE 1
当然(最终)被调用了,但为时已晚,因为 KOA 已经用 404 响应了。
如果有人能够并且愿意解释这里到底发生了什么,谢谢。
据我所知,您的方法并没有真正遵循异步等待模式:async
函数应该是 "await" 异步部分。这就需要 return 一个承诺。因此,您必须将回调封装在 promise
中。像这样的东西可以工作(不是测试,只是为了展示这个概念):
function gmAsync(){
return new Promise(function(resolve,reject){
gm(imageBuffer)
.quality(80)
.write(profile_path, async function (err) {
gm(imageBuffer)
.resize(60, 60)
.quality(80)
.write(chat_path,async function (err) {
resolve(....whatever....);
});
});
});
}
然后您的异步函数可能如下所示:
async function (ctx, next) {
if (some condition) {
await gmAsync()
next()
} else {
await next();
}
},
...
有道理吗?
首先,我对标题感到抱歉,我想不出更好的东西。 我以为我了解 Node.js / KOA,至少是基础知识,但现在我开始觉得我缺少一些基础知识。
看看下面的代码:
router.put("/",
parse,
async function (ctx, next) {
// do something
await next();
},
async function (ctx, next) {
// do something
await next();
},
async function (ctx, next) {
if (some condition) {
gm(imageBuffer)
.quality(80)
.write(profile_path, async function (err) {
gm(imageBuffer)
.resize(60, 60)
.quality(80)
.write(chat_path,async function (err) {
await next(); // HERE 1
});
});
} else {
await next();
}
// HERE 2
},
async function (ctx, next) {
responses.success(ctx, "Success");
}
);
这到底是怎么回事。熟悉 KOA 框架的人一眼就能看出这里是怎么回事。我的问题 starts/ends 在第三个 async function
中。所以我在这里要做的是一些图像处理(保存)。 gm 是异步的,但正如您从代码中看到的那样,我使用的是匿名回调函数,而我试图实现的是当 gm 通过 await next(); // HERE 1
完成时调用最后一个 async function
。
但真正发生的是(根据我的理解)...gm 异步启动..并且 // HERE 2
被命中,并且因为什么都没有,函数结束,KOA returns 默认 404回复。我根本不明白为什么会这样以及如何克服这个问题。
我真正想要发生的是当回调完成时 await next(); // HERE 1
被调用并且我可以 return 成功响应。
await next(); // HERE 1
当然(最终)被调用了,但为时已晚,因为 KOA 已经用 404 响应了。
如果有人能够并且愿意解释这里到底发生了什么,谢谢。
据我所知,您的方法并没有真正遵循异步等待模式:async
函数应该是 "await" 异步部分。这就需要 return 一个承诺。因此,您必须将回调封装在 promise
中。像这样的东西可以工作(不是测试,只是为了展示这个概念):
function gmAsync(){
return new Promise(function(resolve,reject){
gm(imageBuffer)
.quality(80)
.write(profile_path, async function (err) {
gm(imageBuffer)
.resize(60, 60)
.quality(80)
.write(chat_path,async function (err) {
resolve(....whatever....);
});
});
});
}
然后您的异步函数可能如下所示:
async function (ctx, next) {
if (some condition) {
await gmAsync()
next()
} else {
await next();
}
},
...
有道理吗?