Koa.js 后端无法在回调函数中访问响应体

问题描述 投票:0回答:1

我有一个使用 koa.js 创建的后端,其中包含一个回调函数来设置响应正文。特别是,后端的中间件函数如下所示

exports.middlewareFunction = async (ctx) => {
      
     let data = 11;
     someAsyncFunc(data, function (result) => {
          ctx.body = result;
     });
}

程序产生错误,无法访问路线。我对错误的猜测是,由于 someAsyncFunc 中的回调是异步执行的,这会导致 ctx.body 在主流程已经执行之后被设置。特别是,在回调中设置 ctx.body 之前,对中间件的调用已经返回。如果我的理解是正确的,有没有办法修复它,以便我仍然可以异步修改 ctx.body 但同时允许它在响应中返回?

javascript asynchronous callback koa koa2
1个回答
0
投票

我会把这个放在评论中,但我的代表太低了。您提供的代码中存在一些问题,看来您可能对 JavaScript 或至少是异步函数比较陌生,所以我只想提供 MDN 异步函数文档 以及 MDN Promise 文档 来帮助您你进一步了解了。

要解决您提供的代码:

exports.middlewareFunction = async (ctx) => {
      
     let data = 11;
     someAsyncFunc(data, function (result) => {
          ctx.body = result;
     });
}
  1. 为什么你的
    middlewareFunction
    async
    ,却没有等待 在你的职责范围内?如果
    someAsyncFunc
    async
    ,您应该使用 等待。
  2. 如果您的
    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

}
© www.soinside.com 2019 - 2024. All rights reserved.