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

使用Node+Express+MongoDB开发登录API时遇E11000重复键错误求助

解决MongoDB E11000重复键错误

问题原因

错误提示MongoServerError: E11000 duplicate key error collection: test.users index: email_1 dup key: { email: null },说明你的test.users集合存在一个email字段的唯一索引,但当前User模型未定义email字段,导致新插入的用户文档中email字段值为null。由于唯一索引不允许重复的null值,插入第二个用户时就会触发该错误。

解决步骤

1. 删除多余的email索引

登录MongoDB管理界面(如Atlas)或使用MongoDB Shell执行命令,删除users集合上的email_1索引:

// MongoDB Shell执行命令
use test
db.users.dropIndex("email_1")

2. (可选)若需email字段,更新User模型

如果业务需要用户邮箱,修改User模型添加email字段并设置唯一约束(建议同时设为必填):

const User = mongoose.model('User', {
  username: { type: String, required: true, unique: true },
  password: { type: String, required: true },
  email: { type: String, required: true, unique: true }
});

同时更新/signup接口,接收并验证email参数:

app.post('/signup', async (req, res) => {
  try {
    const { username, password, email } = req.body;

    const existingUser = await User.findOne({ 
      $or: [{ username }, { email }] 
    });
    if (existingUser) {
      return res.status(400).json({ 
        message: existingUser.username === username ? 'Username already registered' : 'Email already registered' 
      });
    }

    const user = new User({ username, password, email });
    await user.save();

    res.status(201).json({ message: 'User registered successfully' });
  } catch (error) {
    console.error(error);
    res.status(500).json({ error: 'Error registering user' });
  }
});

3. 额外建议:密码加密存储

当前代码明文存储密码存在安全风险,建议使用bcrypt加密:

// 先安装依赖:npm install bcrypt
const bcrypt = require('bcrypt');

// 注册时加密密码
const saltRounds = 10;
const hashedPassword = await bcrypt.hash(password, saltRounds);
const user = new User({ username, password: hashedPassword });

// 登录时验证密码
const isMatch = await bcrypt.compare(password, user.password);
if (!isMatch) {
  return res.status(401).json({ error: 'Incorrect password' });
}

内容的提问来源于stack exchange,提问作者K1non

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 20:22:37