2016-09-20 51 views
1

根据可用的数据,ui应该得到2个reults,但只有一个,因为我把res.send放到了循环中,所以它会结束,任何人都可以帮助我...... ..如何在node js中执行forloop

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

    }); 

} 
+0

列表数组中的项是什么? – abdulbarik

+0

嗨abdulbarik,我编辑我的代码 – klp

+0

与添加res.send(resp);我得到错误resp没有定义 – klp

回答

1

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

profile.find(...的回拨将在res.send后执行。除此之外,resp变量位于find回调的内部,您正试图在res.send之外。

要处理此问题,无论是使用异步还是承诺。请参阅下面使用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() 
        } 
       }); 
     }) 
    } 

} 

这是如何工作的,它创建个人资料,找到并将其存储在var profiles_to_get = []的列表。你使用Promise.All(profiles_to_get)这将让你在所有的配置文件被提取后做的东西。

+0

我得到错误意外的令牌) – klp

+0

它告诉你是行号? –

+0

这是固定的,它说诺言。所有不是一个功能 – klp

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); 
     }); 
+0

ca请发帖一些代码 – klp

+0

编辑添加代码。 –

+0

它不会去工作,你怎么能''我'价值超出它的范围 – abdulbarik

0

可以循环

1

您可以pushresplist阵列毕竟在一个阵列添加所有的名单和最后发送的数据,并在完成后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: [] 
      }; 
     } 

    }); 
}; 

希望这对你的工作

+0

但我应该在哪里保持res.send(resp)。? – klp

+0

当你想发送资源时,这取决于你吗? – abdulbarik

+0

现在它完成for循环后发送 – abdulbarik

1

不要在异步模式下循环使用。而不是像下面那样使用异步模块。

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

    }); 

}