【问题标题】:DB connection error handling with monk与僧侣的数据库连接错误处理
【发布时间】:2014-12-18 13:42:43
【问题描述】:

我在一个看起来像

的代码上使用了和尚
var monk = require('monk')
var db = monk('localhost/mydb')

if(!db){
  console.log('no connection')
}

当我运行它时,控制台记录“无连接”,但我想知道它为什么没有连接,(也许看到堆栈跟踪'我该怎么做?

【问题讨论】:

    标签: node.js mongodb mongoskin monk


    【解决方案1】:

    Per https://github.com/Automattic/monk/pull/142 monk('localhost') 现在可以用作在连接打开时解析并在抛出错误时拒绝的承诺。

    let db = monk('localhost');
    
    db.catch(function(err) {
      console.log(err)
    });
    

    【讨论】:

      【解决方案2】:

      嘿,我一直在努力解决这个问题,最后得到了一个非常漂亮的解决方案。所以这是一个基本的节点哲学,其中回调将第一个参数作为错误对象。在和尚这里这很好,解决这个问题的代码是:

      var monk = require('monk');
      var db = monk('localhost/mydb', function(err, db){
          if(err){
             console.error("Db is not connected", err.message);
          }
      });
      

      如您所见,回调函数被传递给 monk 对象本身,并且该回调具有我们感兴趣的参数,首先是 err 对象,然后是 db 对象。

      err 对象包含有关建立连接时发生的错误和相应消息的所有信息。

      您可以继续查看 errdb 对象,它们实际上可以更深入地了解僧侣如何处理事情以及 mongo DB 返回了什么对象。

      希望这能解决您的问题。

      【讨论】:

        【解决方案3】:

        根据我的经验发现,如果 MongoDB 的 nodeJS 驱动程序版本不正确,Monk 将无法连接。

        我建议您仔细检查驱动程序版本,以及您声明连接字符串的方式。无论如何,像这里建议的那样解决 Promise 以检查错误日志始终是一个很好的开始方式。

        调试愉快。

        【讨论】:

          【解决方案4】:

          看起来这是已知的错误。 https://github.com/Automattic/monk/issues/24

          在你的 sn-p 中,monkey(url) 返回 db 对象,无论是否连接。

          这是连接上的 db 对象

          > dbgood
          { driver:
             { _construct_args: [],
               _native:
                { domain: null,
                  _events: {},
                  _maxListeners: 10,
                  databaseName: 'dbgood',
                  serverConfig: [Object],
                  options: [Object],
                  _applicationClosed: false,
                  slaveOk: false,
                  bufferMaxEntries: -1,
                  native_parser: true,
                  bsonLib: [Object],
                  bson: [Object],
                  bson_deserializer: [Object],
                  bson_serializer: [Object],
                  _state: 'connected',
                  pkFactory: [Object],
                  forceServerObjectId: false,
                  safe: false,
                  notReplied: {},
                  isInitializing: true,
                  openCalled: true,
                  commands: [],
                  logger: [Object],
                  tag: 1418920835318,
                  eventHandlers: [Object],
                  serializeFunctions: false,
                  raw: false,
                  recordQueryStats: false,
                  retryMiliSeconds: 1000,
                  numberOfRetries: 60,
                  readPreference: [Object] },
               _emitter:
                { domain: null,
                  _events: {},
                  _maxListeners: 50 },
               _state: 2,
               _connect_args: [ 'mongodb://localhost/dbgood', [Object] ] },
            helper:
             { toObjectID: [Function],
               id:
                { [Function: ObjectID]
                  index: 10690856,
                  createPk: [Function: createPk],
                  createFromTime: [Function: createFromTime],
                  createFromHexString: [Function: createFromHexString],
                  isValid: [Function: isValid] } },
            collections: {},
            options: { safe: true },
            _events: {} }
          

          这是 mongodb 未运行时的 db 对象

          > dbbad
          { driver:
             { _construct_args: [],
               _native: null,
               _emitter:
                { domain: null,
                  _events: {},
                  _maxListeners: 50 },
               _state: 0,
               _connect_args: [ 'mongodb://dbbad', [Object] ] },
            helper:
             { toObjectID: [Function],
               id:
                { [Function: ObjectID]
                  index: 10690856,
                  createPk: [Function: createPk],
                  createFromTime: [Function: createFromTime],
                  createFromHexString: [Function: createFromHexString],
                  isValid: [Function: isValid] } },
            collections: {},
            options: { safe: true },
            _events: {} }
          

          也许现在,您可以使用 _native._state 来检查连接。

          【讨论】:

            【解决方案5】:

            我找到的最佳解决方案是向您的数据库添加一个“健康检查”集合,添加一个文档,然后尝试对其执行查找命令。如果您从 find 命令收到错误,则记录错误。

            其他解决方案(例如检查 db 对象)的问题在于,您的状态很可能会保持“正在连接”,直到您的所有 app.js 脚本运行完毕。 Monk 将您的预连接数据库调用排队,因此对数据库进行健康检查调用可确保您的脚本在发出错误或成功消息之前等待连接序列完成。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-06-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-12-01
              • 2018-02-28
              • 2012-11-22
              相关资源
              最近更新 更多