【问题标题】:How to use the values of a POST response in Node.js?如何在 Node.js 中使用 POST 响应的值?
【发布时间】:2019-06-13 13:36:35
【问题描述】:

我正在通过 Node.js 设置 API 连接。我有一些预定义的 cURL 代码,我将其转换为 Node.js 代码,我在下面提供了这些代码。到目前为止一切正常,我在控制台窗口中显示了我需要的值 (token)。

但是,我想知道如何在另一个函数中使用这个 token 变量?所以我不得不以某种方式将其保存为全局变量,但直到现在这都没有用。

var request = require('request');

var headers = {
    'content-type': 'application/x-www-form-urlencoded',
    'Authorization': 'XXXXXXXXXXXXXXXXX'
};

var dataString = 'grant_type=client_credentials';

var options = {
    url: 'XXXXXXXXXXXXXXXX',
    method: 'POST',
    headers: headers,
    body: dataString
};

function callback(error, response, body) {
    if (!error && response.statusCode == 200) {
        var str = body;    
        token = str.split('\"')[3]; 
        console.log(token);
    }
}

request(options, callback);

【问题讨论】:

  • 为什么要将它设置为全局变量?你不能把它作为需要它的函数的参数传递吗?
  • 是的,但我可能需要多个需要“令牌”值的函数。所以我必须两次实现整个逻辑?
  • 在这种情况下,我会将该逻辑放在返回所需令牌的函数中,然后在需要令牌时调用该函数。
  • 这正是我想要做的。但是,我不太确定如何将我提到的代码放入带有令牌返回选项的函数中

标签: node.js api bearer-token


【解决方案1】:

只有当request() 完成并调用callback 函数时,您才能访问token。这是由于 node.js 的 non-blocking 特性 - 当您启动请求时,代码不会阻塞,您只能在请求完成并调用回调函数时访问其响应。因此,您首先定义回调函数并将其作为参数传递给请求。如果你想访问令牌,你可以创建另一个函数并在回调中调用它。

var request = require('request');

var headers = ...
var dataString = ...
var options = ...

function doStuffWithToken(token) {
    console.log(token)
}

function callback(error, response, body) {
    if (!error && response.statusCode == 200) {
        var str = body;    
        token = str.split('\"')[3]; 
        doStuffWithToken(token);
    }
}

request(options, callback);

您还可以使用 Promise 来编写更好的代码:

var request = require('request');

function getToken() {
    var headers = ...
    var dataString = ...
    var options = ...

    return new Promise((resolve, reject) => {
        request(options, (error, response, body) => {
            if (error) return reject(error)
            if (response.statusCode == 200) {
                var str = body;    
                token = str.split('\"')[3]; 
                resolve(token);
            }
        }
    }
}

getToken()
    .then((token) => {
        // here you can access the token
        console.log(token)
    })
    .catch((error) => {
        console.error('unable to retrieve token', error)
    })

在这里,我们围绕我们的请求创建一个包装器。 getToken() 返回一个promise 对象,您可以使用该对象注册两个处理程序,用于成功解析和拒绝并抛出错误。

您也可以将 getToken() 与 await/async 关键字一起使用

var request = require('request');

function getToken() {
    var headers = ...
    var dataString = ...
    var options = ...

    return new Promise((resolve, reject) => {
        request(options, (error, response, body) => {
            if (error) return reject(error)
            if (response.statusCode == 200) {
                var str = body;    
                token = str.split('\"')[3]; 
                resolve(token);
            }
        }
    }
}

async function main() {
    let token = await getToken()

    console.log(token)
}

main()
    .then(...)
    .catch(...)

进一步阅读: Don't block the event loop

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-12
    • 2017-09-11
    • 1970-01-01
    • 2020-06-09
    • 2016-01-09
    • 1970-01-01
    • 2017-08-18
    • 2016-11-29
    相关资源
    最近更新 更多