You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB findOne方法异常,新用户创建误判‘用户已存在’求助

问题原因与修复方案

核心问题:未正确处理异步查询

User.findOne()是异步操作,返回的是Promise对象,你没有用await等待它完成,导致existingUser永远是一个Promise实例,在if(existingUser)判断中会被视为true,所以无论输入什么邮箱,都会触发用户已存在的提示。

修复步骤

  1. 添加await获取实际查询结果
    把异步查询的代码修改为:
let existingUser = await User.findOne({email});
  1. 阻止后续代码执行
    在返回用户已存在的响应后,必须添加return,否则代码会继续执行创建用户的逻辑,引发错误:
if (existingUser) {
  return res.status(400).json({message: 'User already exists!!'});
}
  1. 修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 01:35:27