带有 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 猫鼬请求返回空的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬承诺和Q承诺

Node.js 承诺请求返回

猫鼬批量保存承诺

猫鼬和 q 承诺

q node.js,猫鼬的“帖子”之后的回调[重复]

猫鼬承诺永远不会到达 .then()