如何在Mongoose中校验用户是否存在?现有写法无用户也报错如何解决?
问题成因
- Mongoose 中
User.find()方法无论是否匹配到对应文档,返回结果始终是数组类型:匹配到用户时返回包含用户对象的数组,未匹配到则返回空数组[] - JavaScript 中空数组属于真值,直接用
if (userExist)判断时,无论数组是否为空都会判定为条件成立,所以即使用户不存在也会触发用户已存在的报错。
修正方案
方案1:判断返回数组长度(最小改动)
直接判断查询返回的数组长度是否大于0即可:
const userExist = await User.find({ username: req.body.username }); // 只有数组长度大于0才代表存在匹配用户 if (userExist.length > 0) return res.status(400).send({ message: "User already exists" });
方案2:更换查询方法(性能更优)
判断单个用户是否存在不需要查询所有匹配文档,推荐使用findOne或者exists方法,减少不必要的数据库查询开销:
使用findOne
findOne匹配到文档时返回文档对象,未匹配到时返回null,null属于假值可以直接判断:
const userExist = await User.findOne({ username: req.body.username }); if (userExist) return res.status(400).send({ message: "User already exists" });
使用exists
exists方法专门用于判断文档是否存在,直接返回布尔值,性能最优:
const userExist = await User.exists({ username: req.body.username }); if (userExist) return res.status(400).send({ message: "User already exists" });
内容的提问来源于stack exchange,提问作者Shahab Athar
相关产品推荐
相关产品推荐

