pup*_*pup 5 mongoose mongodb node.js express
我对Mongoldb更新的返回值以及如何处理错误感到困惑。
我正在使用Node.js,Express.js和Mongoose.js作为我的Mongodb驱动程序
当我浏览许多教程时,看到的错误处理的唯一方法是...
示例:一个简单的用户架构..,我想更新phoneNumber
Users
{
email : abc@abc.com,
telephoneNumber : 123456
}
Run Code Online (Sandbox Code Playgroud)
许多教程教会我的用node.js编写的错误处理示例
Users.update({email: abc@abc.com}, {'$set': {telephoneNumber : 654321}, function(err, result){
if(err){
//err
}else if(!result){
//update not success
}else{
//update success
}
});
Run Code Online (Sandbox Code Playgroud)
但是当我查看Mongodb文档时,我发现该更新返回WriteConcern值,该值返回类似以下内容的值
{
"ok" : 1, // update with no err
"nModified" :1, // successfully update 1 user
"n" : 1 // found 1
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,我应该这样处理我的错误,以便我更多地了解更新失败...
Users.update({email: abc@abc.com}, {'$set': {telephoneNumber : 654321}, function(err, result){
if(err || result.ok === 0){
//err
}else if(result.nModified === 0){
//update fail
}else if(result.n === 0){
//could not be found
}else{
//update success
}
});
Run Code Online (Sandbox Code Playgroud)
这是在mongoose / mongodb中更新处理的不好方法吗?
谢谢!!:)
小智 5
这是我们如何处理 mongoose/mongodb 错误。它们可能是“那个值已经存在”之类的错误或类似的问题。
首先在 mongoose 调用的错误块中添加:
if (err) {
return res.status(400).send({
message: errorHandler.getErrorMessage(err,req,res)
});
}
Run Code Online (Sandbox Code Playgroud)
它调用在我们的 errorHandler 文件中定义的“getErrorMessage”函数,该函数可能调用唯一的错误消息函数。我们还将 mongo 数据库中的错误记录在一个单独的集合下。
exports.getErrorMessage = function(err,req,res) {
var message = '';
if (err.code) {
switch (err.code) {
case 11000:
case 11001:
message = getUniqueErrorMessage(err);
break;
default:
message = 'Something went wrong. We have logged this issue and will correct';
}
} else {
for (var errName in err.errors) {
if (err.errors[errName].message) message = err.errors[errName].message;
}
}
//log the error to Mongo
ErrorLog.create(err,req,res);
return message;
};
var getUniqueErrorMessage = function(err) {
var output;
try {
var fieldName = err.err.substring(err.err.lastIndexOf('.$') + 2, err.err.lastIndexOf('_1'));
output = fieldName.charAt(0).toUpperCase() + fieldName.slice(1) + ' already exists';
} catch (ex) {
output = 'Unique field already exists';
}
return output;
Run Code Online (Sandbox Code Playgroud)
};
希望有帮助,如果我能澄清任何事情,请告诉我。