访问 Node.JS Post Request 的响应

Posted

技术标签:

【中文标题】访问 Node.JS Post Request 的响应【英文标题】:Access the response of Node.JS Post Request 【发布时间】:2022-01-12 18:01:11 【问题描述】:

我正在尝试围绕 Spotify API 的客户端凭据流程,在他们的文档中,他们有这种方式来获取访问令牌:

var client_id = 'CLIENT_ID';
var client_secret = 'CLIENT_SECRET';

const authOptions = 
  url: "https://accounts.spotify.com/api/token",
  headers: 
    "Authorization":
      "Basic " +
      new Buffer.from(clientID + ":" + clientSecret).toString("base64"),
    "Content-Type": "application/x-www-form-urlencoded",
  ,
  form: 
    grant_type: "client_credentials",
  ,
  json: true,
;

request.post(authOptions, function(error, response, body) 
  if (!error && response.statusCode === 200) 
    var token = body.access_token;
  
);

现在我正在尝试获取 token 并在 API 调用中导出或使​​用它,但无论我做什么,我都无法访问该语句。

将 POST 放入变量或函数并调用它会导致 undefined

这就是我想要实现的目标:

import authOptions from "./credentials.js";
import pkg from "request";
const  post  = pkg;

const Spotify = 
  getAccessToken() 
    post(authOptions, function (error, response, body) 
      if (!error && response.statusCode === 200) 
        const token = body.access_token;
        return token;
      
    );
  ,

  async search(input) 
    const accessToken = Spotify.getAccessToken();
    const response = await fetch(
      `https://api.spotify.com/v1/search?q=$input&type=artist`,
      
        headers: 
          "Authorization": `Bearer $accessToken`,
          "Content-Type": "application/json",
        ,
      
    );
    const data = await response.json();
    console.log(data);
  ,
;

export default Spotify;

当然,该发布请求没有返回访问令牌。

有什么办法可以将那段代码转换成Async/Await

【问题讨论】:

您可以编写自己的 Promise,也可以使用 Node 的 util.promisify nodejs.org/api/util.html#utilpromisifyoriginal 或在 npm 上使用 3rd 方库... 【参考方案1】:

你可以创建一个新的承诺:

async function getAccessToken()
    return new Promise((resolve, reject) => 
        post(authOptions, function (error, response, body) 
            if(error)
                reject(error);
             else if (response.statusCode === 200) 
                const token = body.access_token;
                resolve(token);
            
         );
    );
;

resolve/reject 允许您在调用回调时返回该值,并将错误传递给调用者进行处理。您可以使用这种格式来promisify 任何基于回调的函数,方法是在promise 中调用它并使用resolve/reject 返回值。

【讨论】:

这样做会返回 Promise 对象,而不是解析后的值 我不得不等待这个函数对另一个函数的响应才能从中获取访问令牌。非常感谢您的帮助!

以上是关于访问 Node.JS Post Request 的响应的主要内容,如果未能解决你的问题,请参考以下文章

node.js处理post请求

无法在 Node.js res.body 中获取 $http.post 请求数据

在 Node.js 中使用 POST 请求上传文件

来自 Google Cloud Functions Node.js 的 HTTP POST?

node.js request and response related

从 ui 前端发送 post req 时,Post Request 消息未显示在 App 中