node.js - 处理 MongoError : server instance pool was destroyed 的好方法

标签 node.js mongodb

我正在运行一个带有 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”对象。

最佳答案

这就是我们正在使用的 - 如果连接失败,它会在 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);
    });

关于node.js - 处理 MongoError : server instance pool was destroyed 的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40509500/

相关文章:

javascript - 如何在 Meteor 中发布一个只发送最近 24 小时数据给客户端的集合?

java - Mongodb 异步 java 驱动程序 find()

javascript - 一起使用 for 循环和异步 waterfall 的最佳方式

mongodb - 通过 mod(ObjectId) 选择文档的一部分

javascript - 如何使用 Node.js 创建自引用 MongoDB 模式并发布路由?

javascript - 控制另一个文件中的异步函数

node.js - 在nodejs中回调内部回调?

node.js - Websocket 连接在 chrome 中有效,但在 firefox 中连接失败?

node.js - 在 NodeJs 中将对象从一个集合移动到另一个集合的最佳方法

MySQL 与 Node Express,使用映射进行更新