如何在节点js中执行forloop

时间:2016-09-20 05:43:58

标签: node.js express

根据可获得的数据,我应该得到2个结果,但只得到一个,因为我把res.send放在了looop所以它结束了,任何人都可以帮助我.......

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: []
            };
        }

    });

}

5 个答案:

答案 0 :(得分:1)

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

在for循环外定义一个变量,向其追加记录,然后在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);
       });

答案 1 :(得分:1)

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

像这样:

loop

希望这对你有用

答案 2 :(得分:1)

不要在异步模式下使用for循环。使用异步模块,如下所示。

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: []
            };
        }

    });

}

答案 3 :(得分:1)

问题在于获取配置文件。您正在使用mongodb的异步查找。因此,在for周期中,您开始获取配置文件,但在完成配置文件的提取之前,您会发送res.send

profile.find(...的回复将在<{strong> res.send之后执行。除此之外,resp变量位于查找回调中,您尝试在外部res.send

要解决此问题,请使用异步承诺。请参阅以下使用promises的代码。

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()
                    }
                });
        })
    }

}

这是如何工作的,它创建了一个配置文件列表,以便在var profiles_to_get = []中查找并存储它。您使用Promise.All(profiles_to_get)可以在获取所有配置文件后执行操作。

答案 4 :(得分:0)

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