Как использовать значения ответа POST в Node.js? - PullRequest
0 голосов
/ 13 июня 2019

Я устанавливаю соединение API через Node.js. У меня был некоторый предопределенный код 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);

1 Ответ

0 голосов
/ 13 июня 2019

Вы можете получить доступ к token только после завершения request() и вызова функции callback. Это связано с тем, что неблокирующая природа файла node.js - когда вы запускаете запрос, код не блокируется, и вы можете получить доступ к его ответу только после его завершения и вызова функции обратного вызова. Следовательно, вы сначала определяете функцию обратного вызова и передаете ее для запроса в качестве аргумента. Если вы хотите получить доступ к токену, вы можете создать другую функцию и вызвать ее внутри функции обратного вызова.

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);

Вы также можете использовать обещания для лучшего кода:

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 () возвращает объект обещание , который можно использовать для регистрации двух обработчиков, когда он успешно разрешается и когда он отклоняет и выдает ошибку.

Вы можете использовать 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(...)

Дальнейшие чтения: Не блокировать цикл обработки событий

...