将请求结果返回到另一个模块

时间:2019-06-14 10:03:32

标签: node.js json npm request

我想将一些内容从request.js中的请求返回到在app.js中调用它的模块

我尝试使用module.exports将信息保存在正文中。我知道请求是异步的,因此我必须等待它返回,但是我不确定如何执行此操作。

我的app.js文件:

const yargs = require('yargs');
const fs = require('fs');


const argv = yargs.
options({
    capcity: {
        description: 'capital city',
        alias: 'c',
        demand: true
    }
})
.help()
.argv;

module.exports.capcity = argv.capcity;

const requestData = require('./requestData.js');

console.log(requestData.country);

我的requestData.js文件:

const request = require('request');
const app = require('./app.js');

var country;

request({
    url: `https://restcountries.eu/rest/v2/capital/${app.capcity}`,
    json: true
}
, (error, response, body) => {

    console.log(app.capcity);
    if (error) {
        console.log('error:', error);
    } else if (body.status == 404) {
        console.log(JSON.stringify(body, undefined, 2));
        console.log("invalid city entered");
    } else {
        country = {
            name: body[0].name,
            code: body[0].currencies[0].code,
            symbol: body[0].currencies[0].symbol
        }
        country = JSON.stringify(country);
        console.log(country);
    }
});

module.exports.country = country;

返回未定义的国家/地区。

1 个答案:

答案 0 :(得分:0)

您在这里遇到了一些竞争条件,您许多人希望对回调进行一些研究,或者更好地改用Promise。另外,您可能希望导出函数而不是变量,这样您的代码将更可重用。

这里有一个使用诺言的例子。注意我正在按照请求文档中的建议使用request-promise-native。您还需要安装该依赖项才能使用它。

在您的app.js中

const yargs = require('yargs');
const fs = require('fs');


const argv = yargs.
options({
    capcity: {
        description: 'capital city',
        alias: 'c',
        demand: true
    }
})
.help()
.argv;

const capcity = argv.capcity;

const requestDataFile = require('./requestData.js');

requestDataFile.requestData(capcity).then(country=>{
    console.log(country)
})

在您的requestData文件中

const request = require('request-promise-native');
const app = require('./app.js');


module.exports.requestData = (capcity)=>request({
        url: `https://restcountries.eu/rest/v2/capital/${capcity}`,
        json: true
    }).then((body)=>{
        return country = {
            name: body[0].name,
            code: body[0].currencies[0].code,
            symbol: body[0].currencies[0].symbol
        }
    })