使用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
相关产品推荐
相关产品推荐

