【问题标题】:Good way of handling MongoError: server instance pool was destroyed处理 MongoError 的好方法:服务器实例池被破坏
【发布时间】:2016-11-09 22:57:49
【问题描述】:

我正在运行一个带有 mongo 连接池的守护进程。它运行了好几天,但最终它崩溃了,并且每个后续请求都会收到此错误:

MongoError: 服务器实例池被破坏

代码类似这样:

var MongoClient = require('mongodb').MongoClient;
var express = require('express');
var app = express();

MongoClient.connect(config.mongo.url, function(err, db) {

    app.use('/', function(req, res, next) {
        db.collection('somecollection').find({}).toArray(function(err, result) {
            console.log(result);
        });
    })

    var server = require('http').Server(app);
    server.listen(config.worker.port, function() {
        var address = server.address();
        logger.info({
            address: address.address,
            port: address.port
        }, 'New Worker created');
    });
});

重新启动进程可以解决问题,但我希望应用程序以某种方式优雅地重新连接并重置那里的“db”对象。

【问题讨论】:

  • !我知道这个问题很老,但你是如何解决这个问题的?有什么建议可以给我吗?

标签: node.js mongodb


【解决方案1】:

这就是我们正在使用的 - 如果连接失败,它会在 5 秒后尝试重新连接。它是为 mongoose 编写的,但我们只是在检测到错误时重新运行连接,对于任何框架都应该这样做。

// Connect to mongodb
    const connect = function () {
        const options = {server: {socketOptions: {keepAlive: 1}}};
        mongoose.connect(config.db, options);
    };
    connect();

    mongoose.connection.on('error', err => {
        let stack;
        if (err) {
            stack = err.stack;
        }
        winston.error('Mongo crashed with error', {err, stack});
    }); // eslint-disable-line no-console
    mongoose.connection.on('disconnected', () => {
        setTimeout(connect, 5000);
    });

【讨论】:

  • 我会尝试看看是否可以使用标准驱动程序中的事件使其工作。唯一的候选人似乎是:mongodb.github.io/node-mongodb-native/2.2/api/…
  • @phraktal 你能听到这个事件吗?我浏览了文档,但仍然无法理解如何收听本机驱动程序的错误。请指教,谢谢:)
猜你喜欢
  • 2018-08-31
  • 2019-06-28
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
  • 2018-01-21
  • 2015-09-03
相关资源
最近更新 更多