NodeJS本机驱动程序上的示例MongoDB错误是什么样的?

时间:2013-12-15 17:55:43

标签: node.js mongodb node-mongodb-native

我似乎无法在其文档或互联网上找到MongoDB错误对象的任何示例。

示例MongoDB错误对象是什么样的?我想根据错误来“处理”错误和/或重新格式化错误。

2 个答案:

答案 0 :(得分:7)

从使用mongodb 1.3.23驱动程序的MongoDB 2.4.8开始,它们看起来像这样:

{
  "name":"MongoError",
  "err":"E11000 duplicate key error index: test.test.$country_1  dup key: { : \"XYZ\" }",
  "code":11000,
  "n":0,
  "connectionId":10706,
  "ok":1
}

答案 1 :(得分:5)

MongoError对象

对于较新版本的node-mongodb-driver(> = 2),事情会有所不同。

nodejs driver source code 2.2内,您可以看到错误对象属性可以是各种各样的(参见第34行)。只有名称和消息字段始终可用。

这是来自mongodb-core/lib/error.js (v2.2)的一段有趣代码,请查看最后一个for循环。

function MongoError(message) {
  this.name = 'MongoError';
  this.message = message;
  Error.captureStackTrace(this, MongoError);
}

MongoError.create = function(options) {
  var err = null;
  if(options instanceof Error) {
    err = new MongoError(options.message);
    err.stack = options.stack;
  } else if(typeof options == 'string') {
    err = new MongoError(options);
  } else {
    err = new MongoError(options.message || options.errmsg || options.$err || "n/a");
    // Other options
    for(var name in options) {
      err[name] = options[name];
    }
  }
  return err;
}

因此,错误对象至少看起来像这样:

{
   "name": : "MongoError",
   "message": "E11000 duplicate key error collection: main_db.stores index..."
}

err.code字段

因此,不保证其他字段,但code非常常见(并且非常有用)。此数字是一个mongodb内部错误代码,驱动程序只在可用时将其添加到MongoError对象。您可以在mongodb源代码文件中找到最新的错误代码列表:error_codes.err

有关nodejs驱动程序如何管理mongodb错误代码的一个有趣示例是the collection bulkWrite source code,它使用toError utilscode来抛出MongoError。

node-mongodb-driver 3.x

MongoError source code has been refactored但错误模型基本相同。