Node.JS 带有 Q promise 的猫鼬请求 return 空 {}

Node.JS mongoose request with Q promise return empty {}

使用猫鼬和 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 相同的请求 return 正确的数据,但奇怪的顺序已完成:

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; v1.4.1

错在哪里?有什么方法可以在函数中调用mongoose?

如果你使用mongoose v4.8.3就不需要q了,直接使用mongoose promise

User.find({})
    .then((user) => {
        console.log(users);
    })
    .catch((err) => {
        console.error(err);
    });

你好像没有掌握异步执行的概念。 "Asynchronous" 表示无法立即获得结果。您需要 return 来自 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");
});