如何在node js中执行forloop

根据可用的数据,ui应该得到2个reults,但只有一个,因为我把res.send在循环播放,所以它已经结束,任何人都可以帮助我请…….

exports.getrequestsdetails = function(req, res) { var params = req.params; console.log(params) var record = db.collection('requests'); var item = { "sent_id": params.id, "status": 1 } record.find(item).toArray((err, result) => { if (err) { return } if (result) { for (var i in result) { var id = result[i].recieved_id; var profile = db.collection('profile'); profile.find({ '_id': new ObjectId(id) }).toArray((err, resp) => { if (err) { return } if (resp) { console.log(resp); } else {} }); } res.send(resp); } //end of if loop else { response = { status: 'fail', data: [] }; } }); } 

问题在于获取configuration文件。 您正在使用mongodb的查找asynchronous 。 因此,在您for循环中,您将开始提取configuration文件,但是在完成configuration文件的提取之前,您将发送res.send

profile.find(...callback将在res.send 之后执行。除此之外, respvariables位于findcallback中,并且您试图res.send在外部。

要处理这个问题,要么使用asynchronous承诺 。 请参阅下面使用promise的代码。

 var Promise = require('bluebird') exports.getrequestsdetails = function(req, res) { var params = req.params; console.log(params) var record = db.collection('requests'); var item = { "sent_id": params.id, "status": 1 } record.find(item).toArray((err, result) => { if (err) { return } if (result) { var profiles_to_get = [] var profiles = [] for (var i in result) { var id = result[i].recieved_id; profiles_to_get.push(get_profile(id, profiles)) } Promise.all(profiles_to_get) .then(() => { res.send(profiles); }) } //end of if loop else { response = { status: 'fail', data: [] }; } }); function get_profile (id, profiles) { return new Promise(function (resolve, reject) { var profile = db.collection('profile'); profile.find({ '_id': new ObjectId(id) }).toArray((err, resp) => { if (err) { reject(err) return } if (resp) { profiles.push(resp) resolve() } else { reject() } }); }) } } 

这是如何工作的,它创build一个configuration文件列表来查找并将其存储在var profiles_to_get = [] 。 你使用Promise.All(profiles_to_get)这将允许你做所有的configuration文件已被提取后的东西。

您只能将一个响应发送回请求。

在for循环之外定义一个variables,追加logging,然后在for循环结束后发送它。

 exports.getrequestsdetails = function(req, res) { var params = req.params; console.log(params) var record = db.collection('requests'); var item = { "sent_id": params.id, "status": 1 } var resList = []; record.find(item).toArray((err, result) => { if (err) { return } if (result) { for (var i in result) { var id = result[i].recieved_id; var profile = db.collection('profile'); profile.find({ '_id': new ObjectId(id) }).toArray((err, resp) => { if (err) { return } if (resp) { console.log(resp); resList[i] = resp; } else{ } }); } }//end of if loop else { resList = { status: 'fail', data: [] }; } res.send(resList); }); 

不要在asynchronous模式下使用for循环。 使用asynchronous模块,而不是像下面。

 var async = require('async'); exports.getrequestsdetails = function (req, res) { var params = req.params; console.log(params) var record = db.collection('requests'); var item = { "sent_id": params.id, "status": 1 } record.find(item).toArray(function (err, result) { if (err) { return } if (result) { var list = []; async.each(result, function (item, cb) { var id = item.recieved_id; var profile = db.collection('profile'); profile.findOne({ '_id': new ObjectId(id) }, function (err, resp) { if (err) { return cb(); } if (resp) { list.push(resp); console.log(resp); return cb(); } return cb(); }); }, function (err) { res.send(list); }); }//end of if loop else { response = { status: 'fail', data: [] }; } }); } 

您可以push list数组中的所有resp完成并在完成loop后发送。

喜欢这个:

  exports.getrequestsdetails = function(req, res) { var params = req.params; console.log(params); var record = db.collection('requests'); var item = { "sent_id": params.id, "status": 1 }; record.find(item).toArray((err, result) => { if (err) { return err; } if (result) { var list = []; for (var i in result) { var id = result[i].recieved_id; var profile = db.collection('profile'); profile.find({ '_id': new ObjectId(id) }).toArray((err, resp) => { if (err) { return err; } else{ list.push(resp); console.log(resp); if(i===result[result.length-1]){ res.send(list); } } }); } } //end of if loop else { response = { status: 'fail', data: [] }; } }); }; 

希望为你工作

您可以将所有列表添加到数组中,最后在循环之后发送数据