重复键的Mongoose save()函数错误对象

时间:2017-07-21 17:31:07

标签: node.js mongodb express mongoose promise

当用户尝试注册新用户和电子邮件时,我使用mongoose promise来捕获错误。这是代码:

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*/}
}

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

1 个答案:

答案 0 :(得分:2)

线索在那里:

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

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

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

相反,对于每个新文档,MongoDB都会假定您的文档具有值name的{​​{1}}属性(此行为记录为here,从&#34开始;相反,......" ),一旦插入第一个文档,任何后续文档都将触发E11000错误。

要解决此问题,您需要删除null索引(您必须从Mongo shell中删除,或者像RoboMongo / Robo 3T那样)。