使用forEach在节点js中发布HTTP帖子

时间:2017-05-26 16:29:51

标签: node.js post foreach

我有一个程序必须遍历一个数组,然后发布它并获取数据。例如。

数组如下。

var fruits = ["apple","banana","mango","orange","carrot"]

我有一个网址如下。

var url ="https://www.fruitsdatabase.com/fruitNames"

我想发布数据。我正在使用以下代码。

for (var i in fruits) {
    var uhri = "https://www.fruitsdatabase.com/fruitNames";
    var options = {
        uri: uhri,
        method: 'POST',
        json: {
            "type": "fruits",
            "params": {
                "name": fruits[i]
            }
        }
    };
    request(options, function (error, response, body) {

        if (!error && response.statusCode == 200) {
            if (body) {
                console.log(fruits[i] + "\t" + body);
            } else {
                console.log('sorry no results found');
            }
        } else {
            console.log("Wow this is an err");
        }
    });

}

当我试图打印时,我得到的结果看起来像这样。

apple [object, object]
banana [object, object]
mango [object, object]
orange [object, object]
carrot [object, object]

当我将console.log(fruits[i] + "\t" + body);更改为console.log(body);

    {
      Table1:
       [ { Name: 'apple',
           type: 'fruit',
           color: 'green',
         }
       ] 
    }
    {
      Table1:
       [ { Name: 'banana',
           type: 'fruit',
           color: 'yellow',
         }
       ] 
    }
    {
      Table1:
       [ { Name: 'mango',
           type: 'fruit',
           color: 'yellow',
         }
       ] 
    } 
    {
      Table1:
       [ { Name: 'orange',
           type: 'fruit',
           color: 'orange',
         }
       ] 
    }
    {}

因为胡萝卜不是水果,它应该返回{}并且在上面的代码中而不是打印carrot [object, object],它应该打印carrot sorry no results found。请让我知道我哪里出错了,我该怎么办呢。

由于

1 个答案:

答案 0 :(得分:0)

您的代码中的问题是您正在执行请求并在for循环中获取回调!

有什么问题?

for循环不会等待request函数完成并调用回调,因此您要创建另一个函数,并发送ifruits[i] {}和回调参数(error, response, body)将不匹配,这就是你得到意外行为的原因。

解决方案

你可以做很多解决方案

1 - 创建额外的功能来处理这个问题:

function sendRequest(options){ // additonal function
    request(options, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            if (body) {
                console.log(options.json.params.name + "\t" + body);
            } else {
                console.log('sorry no results found');
            }
        } else {
            console.log("Wow this is an err");
        }
    });
}

for (var i in fruits) {
    var uhri = "https://www.fruitsdatabase.com/fruitNames";
    var options = {
        uri: uhri,
        method: 'POST',
        json: {
            "type": "fruits",
            "params": {
                "name": fruits[i]
            }
        }
    };    
    sendRequest(options)
}

2 - 使用async模块使用async.parallel调用由Array.protorype.map()创建的一系列功能。

var async = require('async')

var fruitsFuncs = fruits.map(function(fruit){
    return function(fn){
        var uhri = "https://www.fruitsdatabase.com/fruitNames";
        var options = {
            uri: uhri,
            method: 'POST',
            json: {
                "type": "fruits",
                "params": {
                    "name": fruit
                }
            }
        }
        request(options, function (error, response, body) {
            if (!error && response.statusCode == 200) {
                if (body) {
                    console.log(fruit + "\t" + body);
                } else {
                    console.log('sorry no results found');
                }
            } else {
                console.log("Wow this is an err");
            }
            fn(error,body);
        });
    }
})

async.parallel(fruitsFuncs,function(err,results){
    console.log('Finished All')
});