Socket.IO适配器在MongoDB断开连接时抛出不可捕捉的超时错误
我正试图赶上mongodb
断线事件。
它适用于以下设置:
simple.js
'use strict'; var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost:27017/pnsockets', function () { console.log('mongoose connected'); }); mongoose.connection.on('disconnected', function () { console.log('mongoose disconnected'); });
如果simple.js
正在运行,我停止mongodb
( launchctl stop homebrew.mxcl.mongodb
),我得到mongoose disconnected
控制台,我可以处理这个问题。
但运行extended.js
是usung socket.io-adapter-mongo
,当我杀了MongoDB时,我得到以下错误:
/project/node_modules/mongoose/node_modules/mongodb/lib/utils.js:98 process.nextTick(function() { throw err; }); ^ MongoError: server localhost:27017 timed out at null.<anonymous> (/project/node_modules/mongodb-core/lib/topologies/server.js:436:40) at emitTwo (events.js:87:13) at emit (events.js:172:7) at null.<anonymous> (/project/node_modules/mongodb-core/lib/connection/pool.js:144:10) at g (events.js:260:16) at emitTwo (events.js:87:13) at emit (events.js:172:7) at Socket.<anonymous> (/project/node_modules/mongodb-core/lib/connection/connection.js:172:12) at Socket.g (events.js:260:16) at emitOne (events.js:77:13) at Socket.emit (events.js:169:7) at TCP._onclose (net.js:468:12)
extended.js
'use strict'; var mongoose = require('mongoose'); var socketIO = require('socket.io'); var MongoAdapter = require('socket.io-adapter-mongo'); mongoose.connect('mongodb://localhost:27017/pnsockets', function () { console.log('mongoose connected'); _setupSocketAdapter(); }); mongoose.connection.on('disconnected', function () { console.log('mongoose disconnected'); }); var _setupSocketAdapter = function () { var io = socketIO(); var socket = mongoose.connections[0].db; socket.connection = mongoose.connections[0]; // mubsub will need this line var mongoAdapter = MongoAdapter({socket: socket}); io.adapter(mongoAdapter); };
我怎样才能赶上MongoError: server localhost:27017 timed out
错误?
问题来自socket.io-adapter-mongo本身。
如果你看看源代码 ,他们正在使用mubsub 。 Mubsub基本上是Node.js和MongoDB的pub / sub实现。
他们正在build立一个客户端和一个与capped集合一对一映射的通道,但是这些部分没有附加事件处理程序。
根据mubsub文档 ,以下事件可用于频道: *
, message
, document
, ready
和error
。 error
事件也在客户端上可用。
例如,只需添加下面的代码就可以捕捉到您所遇到的错误。
channel.on('error', function (err) { console.error(err.message); }); client.on('error', function (err) { console.error(err.message); });
在断开的情况下,你会得到下面的输出,而不是未处理的错误。
mongoose connected server localhost:27017 timed out mongoose disconnected Mubsub: broken cursor.