首页 > 解决方案 > MongoError:尝试更新用户时出现 E11000

问题描述

所以我有一个节点应用程序,用户可以在其中注册一个帐户(用户名、电子邮件、密码、图标图像)以使用该站点。我创建了一个个人资料页面,其中包含指向编辑表单的链接,以编辑/更新您的用户名、电子邮件和图标图像。但是,每当我尝试更新用户信息时,都会收到 MongoError。

这不会始终如一地发生。有时它会成功更新,所以我不知道是什么导致了问题。

这是我的代码的 github 链接:https ://github.com/P4sc4l94/yelp-camp

我的用户架构:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const passportLocalMongoose = require('passport-local-mongoose');

const UserSchema = new Schema({
  email: {
    type: String,
    required: true,
    unique: true
  },
  image: {
    type: String
  }
});

我试图更新信息的用户控制器:

module.exports.editProfile = async (req, res, next) => {
  const {id} = req.params;
  const {username} = req.body.user;
  const {email} = req.body.user;
  const {image} = req.body.user
  console.log(id)
  console.log(username)
  console.log(email)
  console.log(image)
  const user = await User.findOneAndUpdate(id, {username, email, image}, {
    new: true
  });
  user.save();

  console.log(user);
  req.logout();
  req.flash('success', 'Successfully updated profile!')
  return res.redirect(`/login`);
};

标签: node.jsmongodbmongooseerror-handlingmongoose-schema

解决方案


E11000 是“重复键错误”,这意味着您不能在记录上执行“新”操作,new如果upsert您查询的不是id

你应该在await user.save()使用它的时候做,但没有理由在这里做

如果您使用的是 mongodb ID,您还应该将您id的文档 ID 转换为文档 ID,我认为您是作为安全预防措施

const mongoose = require('mongoose')
const { ObjectId } = mongoose.Types
const { id } = req.params
const user = await User.findOneAndUpdate({ _id: new ObjectId(id) }, { username, email, image });

推荐阅读