使用mongoose和Q作为承诺。但结果是空的{}
var Q = require("q");
var deferred = Q.defer();
User.find({}, function (err, users) {
if (err) {
deferred.reject(next(err));
} else {
deferred.resolve(users);
}
});
return deferred.promise;
与mongoose promise相同的请求返回正确的数据,但奇怪的顺序完成:
console.log("Label 1");
console.log("Label 2 Users = " + getUsers());
console.log("Label 3");
...
getUsers = function(next) {
User.find({}).exec().
.then(function (err, users) {(
if (users) {
console.log("Label 4 Users = " + JSON.stringify(users));
return user;
}
)}
.catch(err) {
return next(err);
});
}
结果:
标签1 - >标签2 - >用户=未定义 - >标签3 - >标签4用户= {...}
Node.Js v7.5;猫鼬v4.8.3; q v1.4.1
哪里出错?我可以用什么方法在函数中调用mongoose?
答案 0 :(得分:1)
如果您使用mongoose v4.8.3,则不再需要q,请直接使用mongoose promise
User.find({})
.then((user) => {
console.log(users);
})
.catch((err) => {
console.error(err);
});
答案 1 :(得分:0)
您似乎没有掌握异步执行的概念。 "异步"意味着结果不能立即获得。您需要从getUsers
函数返回承诺(并修复您的拼写错误):
getUsers = function(next) {
// v---- here
return User.find({}).exec().
.then(function (err, users) {(
if (users) {
console.log("Label 4 Users = " + JSON.stringify(users));
return users;
}
)}
.catch(err) {
return next(err);
});
}
然后等待它:
getUsers().then(function (users) {
console.log("Label 1");
console.log("Label 2 Users = " + users);
console.log("Label 3");
});