首页 > 解决方案 > 将请求结果返回给另一个模块

问题描述

我想将 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;

它返回那个国家是未定义的。

标签: node.jsjsonnpmrequest

解决方案


这里有一些竞争条件,很多人想要对回调进行一些研究,或者最好改用 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
        }
    })

推荐阅读