如何将回调数据传递给 Koa 的 ctx.body?

5
我正在使用TypeScript和Node.js。我有一个回调函数并且当我使用console.log时,以对象的形式获取数据。我想将数据传递给 ctx.body 的 data 键。我可以将该对象推入其他变量中然后传递给 ctx.body 吗?
router.post('/api/send_otp', async (ctx: Koa.Context, next: () => Promise<any>) => {
        var phone = ctx.request.body.phone;

        if (!phone) {
            ctx.body = {
                message: "Please enter phone number",
            };
        } else {

    var options = {
        url: '',
        method: 'POST',
        auth: {
            'user': '',
            'pass': ''
        },
    };

    const callback = function(error, response, body) {
        if (response) {
            console.log(body); // Getting data here
        }else{
            console.log('error',error);
        }
    };

    request(options,callback);

    ctx.body = {
        data: body,   //I want data here
    }
});

这个回答解决了你的问题吗?如何从异步调用中返回响应? - Lux
@Lux 我尝试了一些方案,但对我来说都不起作用。 - user12561026
你需要将 request 转换成一个 Promise 风格的函数,这样你就可以使用 await。在使用 koa 时,你应该在一个 async 函数内部。对于旧版本的 koa,请使用 yield - Lux
@Lux,你能帮我编辑一下我的问题吗?这样我就可以更容易地理解如何做了。 - user12561026
你能发一下包装 koa 代码吗? - Lux
@Lux,请现在检查,我已经发布了它。 - user12561026
1个回答

0

您可以将回调函数转换为 Promise,然后像这样执行

const options = {
  "url": "",
  "method": "POST",
  "auth": {
    "user": "",
    "pass": ""
  }
};

function makeCall() {
  return Promise((resolve, reject) => {
    request(options, (error, response, body) => {
      if (response) {
        resolve(body);
      } else {
        reject(error);
      }
    });
  });
}

makeCall
  .then(body => {
    ctx.body = {
      "data": body   // I want data here
    };
  });



请注意,请求不再维护,因此最好使用一些现代包,如gotaxios

错误:在严格模式下不允许在块内声明函数。 - user12561026
@MawWii 请查看此链接 - https://dev59.com/i5Dea4cB1Zd3GeqPcHyl这是因为你的文件顶部有use strict - Ashish Modi
我没有使用 use strict,但我的文件是 TypeScript。 - user12561026
@MawWii 你需要将它转换为等效的 TypeScript 函数。 - Ashish Modi
这是一个真正的问题。 - user12561026
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接