向第三方 API 请求方法的回调函数不工作

Callback function with request method to third party API is not working

我是回调概念的初学者,正在寻找解决问题的方法。 我使用 node.js 中的请求包调用第三方 API 这里是代码:

在可重复使用的库文件中:auth.js

let getAuthToken = () => {
  let authToken;
  var options = {
    'method': 'GET',
    'url': 'https://<apiURL>/V1/auth_token',
    'headers': {
      'Authorization': 'Basic <token>'
    }
  };
  request(options, (error, response) => {
    if (error) {
      throw new Error(error);
    } else {
      authToken = JSON.parse(response.body);
    }
  });
  return authToken;
}

在我的路线上:http://127.0.0.1:3000/api/v1/musics/authorize-account,我正在调用名为“getAuthorizationToken()”的控制器函数“

控制器文件:music.controller.js

const auth = require('../middleware/auth');

let getAuthorizationToken = async (req, res, next) => {
    let token = await auth.getAuthToken();
    console.log(auth.getAuthToken());
    res.send(token);
}

问题是控制器功能正在完全执行,然后第三方 API 被调用事件我已将 await 添加到该功能。 请向我解释我面临的问题,任何解决方法都会非常有帮助。

您必须 return 承诺能够 await 某些东西并使其按预期工作:

let getAuthToken = () => {
  let authToken;
  var options = {
    'method': 'GET',
    'url': 'https://<apiURL>/V1/auth_token',
    'headers': {
      'Authorization': 'Basic <token>'
    }
  };
  return new Promise((resolve, reject) => {
    request(options, (error, response) => {
      if (error) {
        reject(error);
      } else {
        authToken = JSON.parse(response.body);
        resolve(authToken);
      }
    });
  })
}

await 仅对承诺有用。在您的情况下,您的 getAuthToken 没有 return 承诺。但是你可以改变它。

let getAuthToken = () => {
  return new Promise((res, rej) => {
    let authToken;
    var options = {
      method: "GET",
      url: "https://<apiURL>/V1/auth_token",
      headers: {
        Authorization: "Basic <token>"
      }
    };
    request(options, (error, response) => {
      if (error) {
        rej(error);
      } else {
        authToken = JSON.parse(response.body);
        res(authToken);
      }
    });
  });
};

此外,您还应该将 await 包装在 try / catch

let getAuthorizationToken = async (req, res, next) => {
    try {
       let token = await auth.getAuthToken();
       console.log(token);
       return res.send(token);
    } catch(err) {
       console.log(err);
       return res.status(500).send(err);
    }
}

您应该发送一个不同的错误代码,而不是 500 错误:

  • 400 错误请求:如果缺少一些凭据,例如缺少令牌
  • 401未授权:如果token错误