具有Q promise的Node.JS mongoose请求返回空{}

时间:2017-02-20 22:11:38

标签: node.js mongoose promise q

使用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?

2 个答案:

答案 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");
});