这是我的代码:
var user = UserModel.findOne({ _id: decodedToken.id, }, function (err, user) {
if (err) return handleError(err)
console.log('inside UserModel user = ', user) // this is what I want to return on the variable user
});
console.log("Outside userModel = ",user) // the user inside the findOne callback isn't assigned on the variable user?
在UserModel.findOne回调中,它返回正确的用户:
{ _id: 5979744a02bcec1dc873a96c,
updatedAt: 2017-07-27T05:04:10.313Z,
createdAt: 2017-07-27T05:04:10.313Z,
fullName: 'kring kring',
email: 'sofbaculio@gmail.com',
password: '$2a$08$yiDO.HBGoieBApY8VCHA/Opp6PEpq7.CwZmfc2CkQmQoRfB/ySi4u',
__v: 0,
active: true }
但在回调之外它会返回如下内容:
Query {
_mongooseOptions: {},
mongooseCollection:
NativeCollection {
collection: Collection { s: [Object] },
opts: { bufferCommands: true, capped: false },
name: 'user',
帮助?
答案 0 :(得分:1)
这是因为你的函数实际上返回了一个Mongoose查询,稍后你可以使用它来调用方法exec并使用它来获得结果。
您现在需要执行该查询以获得结果:
user.exec(function(err,result){
if(err)
return console.log(err);
console.log(result);
});
您可以阅读有关使用Mongoose @ http://mongoosejs.com/docs/queries.html
查询的更多信息答案 1 :(得分:0)
问题是它是一个异步调用,因此在这种情况下你必须实现一个实现此目的的承诺。
此外,如果您要使用mongo Object Id(即_id)在模型中找到,那么您应该使用UserModel.findById(decodingToken.id)而不是UserModel.findOne({_ id:decodingToken.id,}。并且下次当你想通过Object Id查询一个集合时,只需去看看Model.findById这是一个很好的做法。希望它有所帮助。
答案 2 :(得分:0)
确定按照这些步骤逐一进行,我正尽力帮助您。
首先你需要安装q库来实现promise。你可以使用
安装它 npm install q
。
getUser(decodedToken.id).then(function(res){
console.log(res);
var user = res;
//Just do it here what ever you want to do
},function(err){
console.log(err)
})
//Here is your promise that you going to return
function getUser(id) {
return Q.Promise(function(resolve, reject) {
UserModel.findById(decodedToken.id), function (err, user) {
if (err) return reject(err)
console.log('inside UserModel user = ', user)
resolve(user)
});
})
}