【问题标题】:How can I wait for my "request" and response back to front end?我如何等待我的“请求”并响应前端?
【发布时间】:2020-09-23 14:18:16
【问题描述】:

我现在正在开发 Zoom API。我想将我的令牌从 ZOOM API 发送到前端作为响应。但是,“来自请求的令牌”总是首先打印且未定义!然后来自 Zoon API 的令牌”将跟随令牌。我怎样才能做到这一点?谢谢!

const Newrequest = require("request");

class ZoomController {
  async getInvLink({ request, response }) {
const instructor_id = params.id;
try {
  let tokenRes;
  const code = request.all().code;
  console.log("the code from frontend is ", code);
  const client_id = _something_
  const client_secret = _something_
  var options = {
    method: "POST",
    url: "https://api.zoom.us/oauth/token",
    qs: {
      grant_type: "authorization_code",
      code: code,
      redirect_uri: _something_
    },
    headers: {
      Authorization:
        "Basic " +
        Buffer.from(client_id + ":" + client_secret).toString("base64")
    }
  };

  await Newrequest(options, function(error, res, body) {
    if (error) throw new Error(error);
    tokenRes = JSON.parse(body);
    console.log("token from Zoon API",tokenRes);
  });

  console.log("token from request",tokenRes);
  return response.status(200).send(tokenRes);
} catch (error) {
  console.log(error);
  return response.status(401).send();
}

【问题讨论】:

  • 你不能只是等待一个函数调用并期望它实际等待它,而不知道它是否返回一个承诺。

标签: javascript node.js request adonis.js zoom-sdk


【解决方案1】:

我不知道这个 api 是什么,但我会做出有根据的猜测,Newrequest 不会返回承诺。所以等待它实际上并不是你想要做的。

然而,你可以做的是使用一些简单的代码将它变成一个承诺:

const tokenRes = await new Promise((resolve, reject) =>  {
    Newrequest(options, function(error, res, body) {
      if (error) reject(error);
      tokenRes = JSON.parse(body);
      console.log("token from Zoon API",tokenRes);
      resolve(tokenRes);
    });
})

【讨论】:

  • 在 promise 构造函数上使用 await 不是一种反模式吗?
  • 对不起,这是他的新请求: const Newrequest = require("request");
  • 您应该考虑使用request-promise 库。这样你就可以await他们开箱即用
【解决方案2】:

您必须在 something 处收听端点,然后您将在那里收到代码。这是您可以发送以换取访问令牌的代码。

【讨论】:

    【解决方案3】:

    请参考此链接:https://www.npmjs.com/package/request#promises--asyncawait

    您可以使用util.promisify() 将接受回调的常规函数​​转换为返回承诺

    例子:

    Newrequest(options, function(error, res, body) {
        if (error) throw new Error(error);
        tokenRes = JSON.parse(body);
        console.log("token from Zoon API",tokenRes);
    });
    
    // to
    
    const util = require('util');
    
    const req = util.promisify(Newrequest)
    const data = await req(options)
    // ... 
    

    这是一个示例代码。请根据您的需要进行调整

    实用课程:https://masteringjs.io/tutorials/node/promisify

    请求库是deprecated

    使用另一个库会很有趣。

    替代方案:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-24
      • 2021-06-21
      • 1970-01-01
      • 2013-11-18
      • 2020-05-13
      • 1970-01-01
      • 2020-10-30
      相关资源
      最近更新 更多