我一直在学习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
}
答案 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
})