我有一个使用 koa.js 创建的后端,其中包含一个回调函数来设置响应正文。特别是,后端的中间件函数如下所示
exports.middlewareFunction = async (ctx) => {
let data = 11;
someAsyncFunc(data, function (result) => {
ctx.body = result;
});
}
程序产生错误,无法访问路线。我对错误的猜测是,由于 someAsyncFunc 中的回调是异步执行的,这会导致 ctx.body 在主流程已经执行之后被设置。特别是,在回调中设置 ctx.body 之前,对中间件的调用已经返回。如果我的理解是正确的,有没有办法修复它,以便我仍然可以异步修改 ctx.body 但同时允许它在响应中返回?
我会把这个放在评论中,但我的代表太低了。您提供的代码中存在一些问题,看来您可能对 JavaScript 或至少是异步函数比较陌生,所以我只想提供 MDN 异步函数文档 以及 MDN Promise 文档 来帮助您你进一步了解了。
要解决您提供的代码:
exports.middlewareFunction = async (ctx) => {
let data = 11;
someAsyncFunc(data, function (result) => {
ctx.body = result;
});
}
middlewareFunction
async
,却没有等待
在你的职责范围内?如果 someAsyncFunc
是 async
,您应该使用
等待。someAsyncFunc
是异步的,您应该考虑从中返回一个值并摆脱回调。通过使用 wait 并使用 someAsyncFunc
将数据作为承诺返回,您就不必担心遇到的问题,并且可以通过在异步函数上正确使用 ctx.body
来安全地操作您的 await
。
exports.middlewareFunction = async (ctx) => {
let data = 11;
const result = await someAsyncFunc(data); // no need for callback
ctx.body = result;
// rest of code
}