带有 Q 承诺的 Node.JS 猫鼬请求返回空
Posted
技术标签:
【中文标题】带有 Q 承诺的 Node.JS 猫鼬请求返回空【英文标题】:Node.JS mongoose request with Q promise return empty 【发布时间】:2017-07-10 08:33:37 【问题描述】:使用 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 承诺的相同请求返回正确的数据,但完成了奇怪的订单:
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?
【问题讨论】:
您的回电在哪里?我所看到的只是下一个(错误)。另外,你为什么不首先使用猫鼬构建承诺? 【参考方案1】:如果你使用 mongoose v4.8.3 就不需要 q 了,直接使用 mongoose promise
User.find()
.then((user) =>
console.log(users);
)
.catch((err) =>
console.error(err);
);
【讨论】:
【参考方案2】:您似乎没有掌握异步执行的概念。 “异步”意味着结果不能立即获得。您需要从您的 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");
);
【讨论】:
以上是关于带有 Q 承诺的 Node.JS 猫鼬请求返回空的主要内容,如果未能解决你的问题,请参考以下文章