与monk的数据库连接错误处理

时间:2014-12-18 13:42:43

标签: node.js mongodb mongoskin monk

我在看起来像

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

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

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

5 个答案:

答案 0 :(得分:6)

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

let db = monk('localhost');

db.catch(function(err) {
  console.log(err)
});

答案 1 :(得分: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对象。 / p>

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

您可以继续查看errdb对象,他们实际上可以更深入地了解monk如何处理事物以及mongo DB返回的对象。

希望这能解决你的问题。

答案 2 :(得分:0)

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

在你的代码片段中,monk(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来检查连接。

答案 3 :(得分:0)

我找到的最佳解决方案是在数据库中添加'healthcheck'集合,添加文档,并在其上尝试find命令。如果从find命令中收到错误,则记录错误。

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

答案 4 :(得分:0)

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

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

调试愉快。