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

Posted

技术标签:

【中文标题】NodeJS 本机驱动程序上的示例 MongoDB 错误是啥样的?【英文标题】:What does an example MongoDB error look like on the NodeJS native driver?NodeJS 本机驱动程序上的示例 MongoDB 错误是什么样的? 【发布时间】:2014-01-03 01:37:30 【问题描述】:

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

示例 MongoDB 错误对象是什么样的?我想为自己的目的“处理”错误和/或重新格式化它,这取决于错误是什么。

【问题讨论】:

【参考方案1】:

从带有 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

【讨论】:

【参考方案2】:

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.yml。

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

node-mongodb-driver 3.x

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

【讨论】:

感谢您的回答。他们做了一个非常可耻的设计来管理错误。在适当的 API 中应该强制访问错误代码。

以上是关于NodeJS 本机驱动程序上的示例 MongoDB 错误是啥样的?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查MongoDB本机nodejs驱动程序中是不是存在集合?

如何在nodejs mongodb本机驱动程序中将字符串转换为ObjectId?

为桌面、移动本机应用程序和 oAuth 功能设计 nodejs expressjs mongodb Webserver 流

mongodb本机驱动程序获取没有数据库名称的集合名称

使用适用于 Node JS 的 mongodb 本机驱动程序记录所有查询

将 MongoDB 与部署在 Elastic Beanstalk 上的 NodeJS 应用程序一起使用的推荐方法是啥?