【问题标题】:Socket.IO adapter throws uncatchable Timed Out error on MongoDB disconnectionSocket.IO 适配器在 MongoDB 断开连接时抛出无法捕获的超时错误
【发布时间】:2016-11-07 12:02:29
【问题描述】:

我正在尝试捕捉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 即使用 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 错误?

【问题讨论】:

  • 您好,您尝试过收听timeout 事件吗?如果您找不到源代码,以下是引发该错误的行:github.com/mongodb/node-mongodb-native/blob/2.1/lib/…
  • 嘿@PatrickRoberts,是的,我已经尝试捕获所有timeoutcloseerror 事件,实际上我可以捕获close,但我仍然得到了之后出错,进程退出。
  • 你有完整的错误堆栈输出吗?
  • 嘿@YuriZarubin,谢谢你的评论,我已经用完整的错误堆栈更新了这个问题。
  • try catch 块不起作用,因为错误是异步的。

标签: javascript node.js mongodb socket.io


【解决方案1】:

问题出在socket.io-adapter-mongo 本身。

如果您查看source code,他们使用的是mubsub。 Mubsub 基本上是 Node.js 和 MongoDB 的 pub/sub 实现。

他们正在设置一个客户端和一个通道,该通道与一个有上限的集合进行一对一的映射,但这些部分上没有附加事件处理程序。

根据mubsub documentation,频道上有以下事件可用:*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.

【讨论】:

  • 谢谢,但我怎样才能访问channelclient 对象?
  • 使用当前的实现,你不能,它们没有暴露,只返回适配器。
猜你喜欢
  • 2019-11-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 2021-03-13
  • 2016-04-04
  • 1970-01-01
相关资源
最近更新 更多