Mongoose使用findOne校验用户是否存在时返回值始终为true问题求助
问题核心原因
checkUserExist是被async标记的异步函数,这类函数默认返回Promise对象,你在调用时没有添加await关键字等待数据库查询完成,拿到的userExist永远是一个Promise实例。在JavaScript的布尔判断规则中,所有非空对象都会被判定为true,这就是你的判断逻辑始终返回true的原因。
你之前尝试的判断都是针对入参userName本身的,完全没有触碰到异步查询的结果处理逻辑,因此无法解决问题。
修正方案
你需要同时修改两处代码:
- 给调用异步方法的
validateRegistrationData函数添加async标记,支持内部使用await - 调用
checkUserExist时添加await关键字,等待数据库查询结果返回后再做判断
修正后完整代码
const checkUserExist = async (userName) => { return await userModel.findOne({userName}); }; // 新增async标记 const validateRegistrationData = async (inputData) => { const {userName} = inputData; // 新增await等待异步结果返回 const userExist = await checkUserExist(userName); if (userExist) { console.log('User found') } else { console.log('User not found') } };
可选优化
如果你只需要判断用户是否存在,不需要返回完整的用户文档,建议使用Mongoose内置的exists方法,查询性能更高,直接返回布尔值:
// 优化后的存在性校验方法 const checkUserExist = async (userName) => { return await userModel.exists({userName}); };
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

