我正在尝试检查用户模型或TempUser模型中是否已创建用户帐户,但遇到的问题是我无法将找到的值添加到对象以处理条件检查。
请检查以下代码和评论:
exports.isRegistered = function(userModel, tempUserModel, username){
var obj = {}; //creating an empty object to add the found results later
userModel.findOne({username: username}, function(err, user){
if(err) throw err;
if(user){
obj.user = user;
console.log(obj); // doesn't fire as no user was found found
}else{
tempUserModel.findOne({username: username}, function(err, tempUser){
if(err) throw err;
obj.tempUser = tempUser;
console.log(obj); // returns object with a tempUser as it was found
});
}
});
console.log(obj); //returns an empty object again.
};
答案 0 :(得分:1)
在看到代码和问题之后,我可以得出以下结论:
未触发,因为找不到用户
您确定User
个集合是否具有给定用户名的这些对象?我不这么认为。请检查您是否提供了username
的正确值以及具有该值的用户集合中存在的文档。
再次返回一个空对象。
回归总是有点难以理解。 好的,让我们打破你在代码中所做的步骤:
obj
,为空白对象findOne
obj
,显示{},即空白对象之所以发生这种情况,是因为第二步是异步。 这就是你的代码流动的方式,
声明obj - >称为FineOne(但仍未执行回调) - >记录的Obj(仍为空白) - >执行FineOne操作的回调并在Obj中填充一些值
我希望现在再清楚一点。我建议你阅读这些博客:
在任何澄清的情况下,请允许我。 谢谢!
答案 1 :(得分:1)
您获得一个空对象,因为这两个查询是异步的。为了使用找到的参数返回正确的对象,您可以在查询中返回它。范围。您可以使用Promises来实现这一目标。
我会构建一个通用函数来对两个集合执行查找:
exports.isRegistered = (userModel, tempUserModel, username) => {
let usr = {};
findUser(username, userModel).then((user) => {
if(user) {
usr.user = user;
return usr;
}
findUser(username, tempUserModel).then((user) => {
if(user) {
usr.tempUser = user;
return usr;
}
return ({error : 'User Not Found'});
}).catch((err) => {
return err;
});
}).catch((err) => {
return err;
});
}
const findUser = (username, collection) => {
return new Promise((resolve, reject) => {
collection.findOne({username : username}).then((err, user) => {
if(err) return reject(err);
if(user) return resolve(user);
});
});
}
您也可以将这两个调用放在一个数组中,解析它们并加入它们的结果,这样就可以更快地执行它们。