NodeJS request.get body

时间:2018-05-22 12:47:04

标签: node.js

我想使用NodeJS从2个网址获取响应,并将它们放在一个数组中供以后处理。

我无法将body / resp存储在request.get函数之外。 Resp在request.get之外有undefined个。

有什么建议我做错了吗? THX

var msurls = ["http://example.org/get1", "http://example.org/get2"];
var request = require("request");
var msresult = [];

msurls.forEach(function(msurl) {
        var resp;
        request.get(msurl,function(error,response,body){
                if(error) {
                        console.log(error);
                } else {
                        resp = body;
                }
        });
        msresult.push(resp);
});
console.log(msresult);

3 个答案:

答案 0 :(得分:0)

您的代码时间存在问题。在您msresult.push(resp);完成之前,request.get已被解雇,因此您推送的resp尚无值。

你可以使用等待......(我可能错了)

var msurls = ["http://example.org/get1", "http://example.org/get2"];
var request = require("request");
var msresult = [];

msurls.forEach(function(msurl) {
    await request.get(msurl, function(error, response, body){
        if(error) {
            console.log(error);
        } else {
            msresult.push(body);
        }
    });
});
console.log(msresult);

答案 1 :(得分:0)

查看Promise.all() - 它允许您执行多个异步请求。

清洁解决方案将是:

const request = require("request");

const getData = async (requests) => {
  return Promise.all(requests);
};

const doWork = async () => {
  const msurls = ["http://example.org/get1", "http://example.org/get2"];
  const requests = msurls.map(url => request.get(url));

  const result = await getData(requests);
  console.log(result);
  return result;
};

至于进一步学习,请查看Node支持的ES6功能,并阅读Javascript中的异步编程。

答案 2 :(得分:0)

request模块不支持promises,而是使用request-promise-native,否则,你必须使用@Gediminas写的回调。

我更喜欢这种更干净的解决方案,这是更现代的javascript:

let msurls = ["http://example.org", "http://example.org"]
let request = require("request-promise-native")

async function doRequests() {
    return await(Promise.all(
        msurls.map(async msurl => await request(msurl)))
    )
}

doRequests().then(msresult => console.log(msresult))

您已经有一个包含结果的数组,代码看起来是同步的。