2015-07-01 3 views
3

Я немного смущен возвратным значением обновления Mongoldb и как мне обрабатывать ошибки с ним.Значение возврата и обработки ошибок Mongoose/Mongodb

Я использую Node.js, Express.js и Mongoose.js как мой водитель MongoDB

Как я смотрю через много учебника, единственный способ обработки ошибок, я видел это ...

Примера : простая схема пользователь .. и я хочу, чтобы обновить telephoneNumber

Users 

{ 
    email : [email protected], 
    telephoneNumber : 123456 
} 

Пример обработки ошибок написано в Node.js, что многие учебник научил меня

Users.update({email: [email protected]}, {'$set': {telephoneNumber : 654321}, function(err, result){ 
     if(err){ 
      //err 
     }else if(!result){ 
      //update not success 
     }else{ 
      //update success 
     } 
}); 

, но когда я смотрю через MongoDB документацию, я обнаружил, что значение WriteConcern возврата обновление, которое вернуть что-то вроде этого

{ 
     "ok" : 1,    // update with no err 
     "nModified" :1,  // successfully update 1 user 
     "n" : 1    // found 1 
} 

Так что мой вопрос, я должен обрабатывать свою ошибку, как это вместо того, чтобы я знал бы больше о неудачах обновления ...

Users.update({email: [email protected]}, {'$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 
     } 
}); 

Является ли это плохой подход для обновления и обработки в мангустов/MongoDB?

Спасибо! :)

ответ

3

Вот как мы справляемся с ошибками mongoose/mongodb. Они могут быть ошибками, такими как «эта ценность уже существует» или аналогичные проблемы.

Сначала в блоке ошибки вызова мангустов мы добавим:

if (err) { 
    return res.status(400).send({ 
        message: errorHandler.getErrorMessage(err,req,res) 
       }); 
} 

Что вызывает функцию «getErrorMessage», который определен в нашем файле ErrorHandler, который может вызывать уникальную функцию сообщения об ошибке. Мы также регистрируем ошибки в нашей базе данных 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; 

};

Надеюсь, что это поможет, сообщите мне, смогу ли я прояснить что-либо.

+0

Благодарю за помощь :) У меня есть некоторые вопросы. Итак, если я обрабатываю ошибку, как это, это означает, что я могу обрабатывать ошибку, как первый пример моего сообщения? Если да, будет ли эта обработка ошибок работать для каждой операции mongodb/mongoose (например, обновление, поиск, сохранение и т. Д.)? Спасибо :) – pupuupup

+0

О да, и еще 1 вещь, что, если я хочу знать, обновила ли когда-либо обновляемую документацию какого-либо документа. Должен ли я по-прежнему использовать result.nModified> 0, чтобы проверить, обновлен ли какой-либо документ? – pupuupup

+0

Да, вы можете сделать это, чтобы убедиться, что обновление произошло. –