MongoDB findOne方法异常,新用户创建误判‘用户已存在’求助
问题原因与修复方案
核心问题:未正确处理异步查询
User.findOne()是异步操作,返回的是Promise对象,你没有用await等待它完成,导致existingUser永远是一个Promise实例,在if(existingUser)判断中会被视为true,所以无论输入什么邮箱,都会触发用户已存在的提示。
修复步骤
- 添加await获取实际查询结果
把异步查询的代码修改为:
let existingUser = await User.findOne({email});
- 阻止后续代码执行
在返回用户已存在的响应后,必须添加return,否则代码会继续执行创建用户的逻辑,引发错误:
if (existingUser) { return res.status(400).json({message: 'User already exists!!'}); }
- 修复JWT令牌生成的错误
生成token时你误用了existingUser的属性,但新用户场景下existingUser是null,应该用刚创建的result对象:
const token = jwt.sign( {email: result.email, id: result._id}, 'test', {expiresIn: '1hr'} );
完整修复后的代码
export const signUp = async (req, res) => { const {email, password, username, roomid} = req.body; try { console.log(req.body); let existingUser = await User.findOne({email}); console.log(existingUser); if (existingUser) { return res.status(400).json({message: 'User already exists!!'}); } const hashedPassword = await bcrypt.hash(password, 12); const result = await User.create({ email, password: hashedPassword, username, roomid, }); const token = jwt.sign( {email: result.email, id: result._id}, 'test', {expiresIn: '1hr'} ); res.status(201).json({result, token}); } catch (err) { console.log(err); res.status(500).json({message: 'Server error occurred'}); } };
内容的提问来源于stack exchange,提问作者Rishabh Malviya
相关产品推荐
相关产品推荐

