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正在运行,我停止mongodblaunchctl 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文档 ,以下事件可用于频道: *messagedocumentreadyerrorerror事件也在客户端上可用。

例如,只需添加下面的代码就可以捕捉到您所遇到的错误。

 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.