我正在循环一个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);
答案 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}
来自何处,因此创建网址时可能会出错。