当用户尝试注册新用户和电子邮件时,我使用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*/}
}
我尝试创建重复值,但它显示上面的相同错误,而没有指出哪个属性具有重复值。获取指定哪个属性有错误/重复值的任何其他想法/方法?
答案 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那样)。