【问题标题】:Mongoose save() function error object for duplicate keys重复键的 Mongoose save() 函数错误对象
【发布时间】:2017-12-27 20:25:55
【问题描述】:

当用户尝试注册新用户和电子邮件时,我使用猫鼬承诺来捕获错误。代码如下:

user.service.js

function create(userParams) {
    var user      = new User(userParams);
    return user.save();
}

在我的 API 路由器上,这里是调用函​​数的代码:

user.controller.js

function register(req, res) {
    var user = {
        uname    : req.body.uname, 
        email    : req.body.email, 
        password : req.body.password
    }
    userService.create(user)
        .then(function(){
             res.status(200).json({ success: true, message: 'User Created!' });
        })
        .catch(function(err){
            res.status(400).send(err); 
        })
}

当我运行函数和存储在 mongoDB 上的数据时,它工作正常。我想知道的是,我在 uname 和 email 上都添加了 unique 属性,所以当我尝试在其中任何一个上创建重复值时,都会产生错误。这是已“捕获”的正文错误

{
   "code":11000,
   "index":0,
   "errmsg":"E11000 duplicate key error collection: flash-card.users index: name_1 dup key: { : null }",
   "op":{/*Contain all info that want to be registered*/}
}

我尝试创建重复值,但它在上面显示相同的错误,但没有指明哪个属性具有重复值。任何其他想法/方法来指定哪个属性得到错误/重复值?

【问题讨论】:

  • 看起来你的名字是空的。这已经存在于数据库中。这就是为什么会发生这种情况

标签: node.js mongodb express mongoose promise


【解决方案1】:

线索在那里:

collection: flash-card.users
index: name_1
dup key: { : null }

看起来您的架构曾经有一个名为 name(从索引名称推断)的属性,该属性被标记为唯一。

我认为在某些时候,您重命名了该属性(可能重命名为 uname),但 name 上的唯一索引不会在您这样做时自动删除

相反,对于每个新文档,MongoDB 将假定您的文档具有 name 属性,其值为 null(此行为记录在 here,以 “相比之下,...”),并且一旦插入第一个文档,任何后续文档都会触发 E11000 错误。

要解决此问题,您需要删除 name_1 索引(您必须从 Mongo shell 或类似 RoboMongo/Robo 3T 之类的东西中执行此操作)。

【讨论】:

  • 谢谢你的线索!我删除了 uname 的索引,它显示了正确的重复键。
猜你喜欢
  • 2013-08-09
  • 2018-10-12
  • 2015-05-01
  • 2020-01-08
  • 2021-05-29
  • 1970-01-01
  • 2021-07-31
  • 2016-09-14
相关资源
最近更新 更多