如何在猫鼬中捕获错误代码

Posted

技术标签:

【中文标题】如何在猫鼬中捕获错误代码【英文标题】:How to catch errorcode in mongoose 【发布时间】:2016-09-07 07:19:55 【问题描述】:

只是在玩我的第一个登录系统,基于 nodejs/express/mongoose/passport。

我发现了更多关于这个主题的帖子,但它们都与我的略有不同。

型号:

module.exports = mongoose.model('User',
id: String,
username: String,
password: String,
email:  type: String, unique: true 
);

对于用户名,查询用于检查用户名是否已被使用。但这不是这样做的方法。我了解到数据库本身必须检查这一点。 所以这就是我在电子邮件字段中尝试它的原因。

保存一个新用户:

// save the user
                    newUser.save(function(err) 
                        if (err)
                            console.log('Error in Saving user: '+err);  
                            //throw err; // server stops working immediately!!
                            return done(null, false, req.flash('message','DB error...'));
                        
                        console.log('User Registration succesful');    
                        return done(null, newUser);
                    );

我在“throw err”之前添加了斜杠,因为节点服务器在尝试“throw”时会立即停止。 我复制/粘贴了 return done(...) 部分,效果很好。

控制台错误信息:

 Error in Saving user: MongoError: insertDocument :: caused by :: 11000 
 E11000 duplicate key error index: mydb.users.$email_1  dup key:  : 
 "sub@xxxxx.nl" 

问题: 如果发生任何数据库错误,我不能假设它总是重复插入错误,因此我需要检查这一点,以便显示有关重复电子邮件地址的消息或其他有用的消息。

我找不到类似的东西:

if(errorcode == E11000)
 message="duplicate email"
else
    message="an error occured bla bla"

【问题讨论】:

【参考方案1】:

错误码存储在err.code,所以你可以这样检查:

if (err) 
  if (err.code && err.code === 11000) 
    message = "duplicate email";
   else 
    message = "an error occured bla bla";
  

【讨论】:

谢谢,那电子邮件本身呢?或者更好:看起来怎么错了? @Terradon try err.toJSON().op.email (虽然我不知道这是否适用于所有版本的 MongoDB 驱动程序,但它似乎是内部的,而且 AFAIK 它完全没有记录)。 err 本身是 WriteError 的一个实例,FWIW。

以上是关于如何在猫鼬中捕获错误代码的主要内容,如果未能解决你的问题,请参考以下文章

如何在猫鼬中使用聚合

如何在猫鼬中转换为字符串?

如何使用聚合在猫鼬中对文档数组进行分页?

在猫鼬中排序

如何在猫鼬中找到随机记录[重复]

如何在猫鼬中保存子文档的数组?