在node.js中使用forEach函数时出现问题

时间:2016-09-23 05:29:52

标签: node.js mongodb foreach mongoose

我一直在学习q promises,并尝试构建一些模拟API来实现其功能,同时这样做我遇到了以下错误,

  

Enterprise.forEach不是函数

我的API代码如下,

var mongoose = require('mongoose');

var Enterprise = mongoose.model('Enterprise_gpy');
var q = require('q');

var displayEnterprise = function(req, res) {

  function displayEnterpriseName() {

    var deferred = q.defer();

    Enterprise.forEach(function(err, doc) {

      if (err) {
        console.log('Error Finding Files');
        deferred.reject(err);
      } else {
        var name = Enterprise.enterprise_name;

        deferred.resolve({
          name: name
        });
      }

      return deferred.promise;
    });
  }

  function displayEnterpriseEmail() {


    var deferred = q.defer();

    Enterprise.forEach(function(err, doc) {

      if (err) {
        console.log('Error Finding Files');
        deferred.reject(err);
      } else {
        var email = Enterprise.enterprise_email;

        deferred.resolve({
          email: email
        });
      }

      return deferred.promise;
    });
  }
  q.all([
      displayEnterpriseName(),
      displayEnterpriseEmail()
    ])
    .then(function(success) {
      console.log(500, success);
    })
    .fail(function(err) {
      console.log(200, err);
    });
}
module.exports = {

  displayEnterprise: displayEnterprise
}

2 个答案:

答案 0 :(得分:2)

在你的代码中Enterprise是一个mongoose模式,所以当你尝试使用forEach进行循环时,那么

  

Enterprise.forEach不是函数

您可以在forEach之后使用Enterprise.find()。所以使用

Enterprise.find({}, function(err, docs) {
   if (err) {
    console.log('Error Finding Files');
    deferred.reject(err);
   } else {
     var names = [];
     docs.forEach (function(doc) {
       var name = doc.enterprise_name;
       names.push(name);// pushed in names array
       //.....
     });
     deferred.resolve({
      names: names
    }); // return all names
   }
});

而不是

Enterprise.find().forEach 

并且应该使用

var name = doc.enterprise_name;代替var name = Enterprise.enterprise_name;

var email = doc.enterprise_email;代替var email = Enterprise.enterprise_email;

答案 1 :(得分:1)

forEach仅适用于数组,您可以在mongoose模型上使用它。 试试这个:

Enterprise.find().exec(function(err, docs) {
  docs.forEach(function(doc) {
    // do something with all the documents
  }
  // do something outside the loop
})