我在看起来像的代码上使用和尚
var monk = require('monk')
var db = monk('localhost/mydb')
if(!db){
console.log('no connection')
}
当我运行它时,控制台记录'无连接',但我想知道它为什么没有连接,(也许看到堆栈跟踪'我该怎么做?
每个https://github.com/Automattic/monk/pull/142 monk('localhost')
现在可以用作一个承诺,它在连接打开时解析并在抛出错误时拒绝。
IE
let db = monk('localhost');
db.catch(function(err) {
console.log(err)
});
嘿,我一直在为此苦苦挣扎,最后得到了一个非常漂亮的解决方案。所以这是一个基本的节点哲学,其中回调将第一个参数作为错误对象。在和尚这里这很好,解决这个问题的代码是:
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
对象包含有关建立连接时发生的错误和相应消息的所有信息。
您可以继续查看err
和db
对象,它们实际上可以更深入地了解僧侣如何处理事情以及 mongo DB 返回了哪些对象。
希望这能解决您的问题。
根据我的经验,我发现如果 MongoDB 的 nodeJS 驱动程序版本不正确,Monk 将无法连接。
我建议您仔细检查驱动程序版本,并以您声明连接字符串的方式。无论如何,像这里建议的那样解决 Promise 以检查错误日志始终是一个好的开始方式。
调试愉快。
看起来这是已知的错误。 https://github.com/Automattic/monk/issues/24
在您的代码段中,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 来检查连接。
我找到的最佳解决方案是将“healthcheck”集合添加到您的数据库中,添加一个文档,然后尝试对其执行查找命令。如果您从 find 命令收到错误,则记录错误。
其他解决方案(例如检查 db 对象)的问题在于,您的状态很可能会保持“正在连接”,直到您的所有 app.js 脚本完成运行为止。Monk 将您的预连接数据库调用排队,因此对数据库进行健康检查调用可确保您的脚本在发出错误或成功消息之前等待连接序列完成。