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

Koa.js backend unable to access response body in callback function

提问人:Kevin Tommy 提问时间:8/1/2023 更新时间:8/1/2023 访问量:39

问:

我有一个使用 koa.js 创建的后端,其中包含一个用于设置响应正文的回调函数。具体而言,后端的中间件功能如下所示

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

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

JavaScript 异步 回调 koa koa2

评论


答:

0赞 jabronidude 8/1/2023 #1

我会把它放在评论中,但我的代表太低了。您提供的代码中存在一些问题,看起来您可能是 JavaScript 的新手,或者至少是异步函数,所以我只想提供 MDN 异步函数文档和 MDN Promise 文档来帮助您进一步理解。

要解决您提供的代码,请执行以下操作:

exports.middlewareFunction = async (ctx) => {
      
     let data = 11;
     someAsyncFunc(data, function (result) => {
          ctx.body = result;
     });
}
  1. 为什么是你的,但没有等待 在您的职能范围内?如果是,则应使用 等待。middlewareFunctionasyncsomeAsyncFuncasync
  2. 如果你是异步的,你应该考虑从中返回一个值并删除回调。通过使用 await 并将数据作为 promise 返回,您不必担心您遇到的问题,并且可以通过正确使用异步函数来安全地操作您的问题。someAsyncFuncsomeAsyncFuncctx.bodyawait

建议的示例修复:


exports.middlewareFunction = async (ctx) => {
      
     let data = 11;
     const result = await someAsyncFunc(data); // no need for callback
     ctx.body = result;
     // rest of code

}