HTTP请求循环返回相同的值

时间:2015-11-14 11:02:12

标签: node.js mongoose request

我正在循环一个HTTP请求,以根据leagueId从多个restful api获取值。但是,即使查找查询中的data[tournament].league返回

14
1
2
9
12
8

当我尝试在我的请求中控制data[tournament].league时,它只返回

8
8
8
8
8
8

为什么它不会返回上述不同的联赛身份

var mongoose   = require('mongoose');
mongoose.connect('mongodb://db');
var Match = require('./app/models/match');
var League = require('./app/models/league');


// call the packages we need
var express    = require('express');        // call express
var app        = express();                 // define our app using express
var bodyParser = require('body-parser');
var request = require('request');
var x = require('x-ray')();
var CronJob = require('cron').CronJob;
var async = require('async');

// configure app to use bodyParser()
// this will let us get the data from a POST
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

var port = process.env.PORT || 8080; 
var router = express.Router(); 



router.get('/get/matches', function(req, res, next){

    var base = "http://URL";

    League.find({}, function(err, data) {
        if (err) {
            console.log(err);
        } else {
            for(var tournament in data){
                console.log(data[tournament].league);
                request({
                    method: "GET",
                    url: `${base}/api/league/${data[tournament].league}`,
                    json: true
                    }, function(err, response, body) {
                        if (err) {
                            console.log(data[tournament].league);
                        } else {
                            console.log(body);
                        }

                });

            }
        }

    });

});






app.use('/api', router);

app.listen(port);
console.log('Magic happens on port ' + port);

1 个答案:

答案 0 :(得分:1)

尝试异步运行您的请求。您可以使用this库。我认为问题的存在是因为"回调"根据您的要求。您正在循环覆盖League集合中的所有项目,并基本上同时触发所有请求。这意味着您的循环可能已在第一个请求完成之前完成。

相反,你应该遍历你的数组,触发一个请求,等待响应,然后继续你的循环再次执行完全相同的过程,直到你从你的集合中的数组结束。

我已使用async库更新了您的查询+循环。请尝试以下代码:

League.find({}, function(err, data) {
    if (err) {
        console.log(err);
    } else {
        async.eachSeries(data, function iterator(item, callback) {
            console.log('item', item.league);
            request({
                method: "GET",
                url: `${base}/api/league/${item.league}`,
                json: true
            }, function(err, response, body) {
                if (err) {
                    console.log('Error for request with league:', item.league);
                } else {
                    console.log(body);
                }
                callback();
            });
        }, function done() {
            console.log('All finished!');
        });
    }
});

一点注意事项:我不知道${base}来自何处,因此创建网址时可能会出错。