来自 http 的节点 js 未定义值 return 获取异步函数

node js undefined value return from http get async function

我正在尝试从异步 function.However 中获取 http get 响应,函数值正在显示,但 return 值未定义。

Even promise not undefined values

请在下面找到代码

'use strict';
const express = require('express');
    var request = require('request');
var https = require('https');

async function getCurrencies() {
    let    response;
    try {


        var getOptions = {
            url: 'http://localhost:3000/api/currency',
            method: 'GET',
            headers: {
                'Content-Type': 'application/json'
            },
            json:true
        };

        await request(getOptions, function (err, res, body) {

            if (res && (res.statusCode === 200 || res.statusCode === 201)) {
        console.log(' response ', res.body.rates.INR);

            return res.body;
            } else {
                console.log('error body ', body);

            }
        });

    } catch (error) {
        console.log(" error pulling ", error);
        process.exit();
    }

}

var tt =  getCurrencies().then(function(value) {
    console.log(' tt values ',value);

}
);

下面是日志

 tt values  undefined
 response 64.945

request module/function 没有 return Promise,所以你不能使用 await。您有两个选择:

  1. 使用标准节点回调模式,或者
  2. 切换到例如request-promise-native 模块如果你坚持使用async/await 模式

我会重写做这样的事情:

function getCurrencies() {

    return new Promise((resolve, reject) => {
        try {

            var getOptions = {
                url: 'http://localhost:3000/api/currency',
                method: 'GET',
                headers: {
                    'Content-Type': 'application/json'
                },
                json:true
            };

            request(getOptions, function (err, res, body) {

                if (res && (res.statusCode === 200 || res.statusCode === 201)) {
                    console.log(' response ', res.body.rates.INR);
                    resolve(res.body);
                } else {
                    console.log('error body ', body);
                    reject(new Error('Error body: ' + JSON.stringify(body)));
                }
            });

        } catch (error) {
            console.log(" error pulling ", error);
            process.exit();
        }
    });
}

getCurrencies().then(function(value) {
    console.log(' tt values ',value);
});

你也可以做一些更紧凑的事情:

const rp = require('request-promise');
function getCurrencies() {

    var getOptions = {
        url: 'http://localhost:3000/api/currency',
        method: 'GET',
        headers: {
            'Content-Type': 'application/json'
        },
        json:true,
        resolveWithFullResponse: true 
    };

    return rp(getOptions).then((response) => {
        return response.body;
    });
}

getCurrencies().then(function(value) {
    console.log(' tt values ',value);
}).catch ((err) => {
    console.error('An error happened: ' + err);
});