由于MongoDB连接丢失导致Express服务器崩溃

时间:2015-07-14 12:40:46

标签: express

我遇到了使用以下内容构建的HTTP Node.js服务器的问题:

  • Ubuntu 14.04
  • MongoDB 3.0.4
  • iojs v2.3.3
    • express=4.10.*
    • mongodb=1.4.34

正在使用以下中间件:

app.use(response_time());

app.use(body_parser.urlencoded({extended: true}));

app.use(body_parser.json());

var MongoClient = require('mongodb').MongoClient;
app.use(function (req, res, next) {
    var connection_options = {auto_reconnect: false};
    MongoClient.connect(config.server.db, connection_options,  function (err, db) {
        if (err) {
            log.error(err); // Logging error.
            return next(err);
        }

        req.db = db;
        next();
    }); 
}); 

服务器在20:40:10开始运行并成功处理了多个请求。

在02:59:02,每个请求都开始记录以下错误:

02:59:02.114Z ERROR CrowdStudy: failed to connect to [127.0.0.1:27017]
Error: failed to connect to [127.0.0.1:27017]
    at null.<anonymous> (/home/ncphillips/Projects/crowdstudy/node_modules/mongodb/lib/mongodb/connection/server.js:555:74)
    at emitThree (events.js:97:13)
    at emit (events.js:175:7)
    at null.<anonymous> (/home/ncphillips/Projects/crowdstudy/node_modules/mongodb/lib/mongodb/connection/connection_pool.js:156:15)
    at emitTwo (events.js:87:13)
    at emit (events.js:172:7)
    at Socket.<anonymous> (/home/ncphillips/Projects/crowdstudy/node_modules/mongodb/lib/mongodb/connection/connection.js:534:10)
    at emitOne (events.js:77:13)
    at Socket.emit (events.js:169:7)
    at emitErrorNT (net.js:1237:8)

我最初的怀疑是,我认为连接池已经填满,因为我没有办法处理呼叫req.db.close()。我认为传递选项{auto_reconnect: false}可以通过在一段时间后自动关闭连接来解决这个问题,但似乎我错了。

请注意,重新启动服务器可以解决问题,所以我认为问题与Node而不是Mongo有关。

如果这与连接池有关,是否有一些我可以通过的设置来解决这个问题,或者我是否有一个终端软件可以确保连接始终关闭?

非常感谢能帮助我的人!

1 个答案:

答案 0 :(得分:1)

autoReconnect是一个应该传递给服务器配置的选项:

MongoClient.connect(config.server.db, {
  server : { autoReconnect : false }
}, ...);

documentation包含一些错误:它指出默认设置为false(它不是),并且还声明应在被调用的对象中设置autoReconnect socketOptions(不应该)。

您可以向传回的db对象添加各种事件侦听器,以检测与数据库的连接何时关闭/重新连接/...:

db.on('close', function(reason) { ... });
db.on('reconnect', function(db) { ... });

更多活动here