【问题标题】:Mongoose/MongoDB in Node.JS stops returning records after a whileNode.JS 中的 Mongoose/MongoDB 在一段时间后停止返回记录
【发布时间】:2017-10-23 23:10:21
【问题描述】:

我正在运行一个脚本,它可以在我拥有的数据库中查找数据。一段时间后由于某种原因,它会停止查找任何数据,但不会将任何错误输出到屏幕或通过 node.js。这是我为猫鼬设置的以下设置。顺便说一句,我在 MLAB 有一个数据库!

var connectionOptions = {
    server: {
        auto_reconnect: true,
        poolSize: 16,
        socketOptions: {
            keepAlive: 120,
            connectTimeoutMS: 5 * 60 * 60 * 1000,
            socketTimeoutMS: 5 * 60 * 1000
        }
    },
    replset: {
        poolSize: 16,
        socketOptions: {
            connectTimeoutMS: 300000, // 5 minutes
            keepAlive: 120
        },
        ha: true, // Make sure the high availability checks are on
        haInterval: 5000, // Run every 10 seconds
    }
};

//mongoose.set('debug', true);
mongoose.connect('mongodb://XXXXXXXXXXXX@XXXXXX.mlab.com:57328,XXXXXXXX.mlab.com:57328/XXXXXXXXX?replicaSet=rs-XXXXXX', connectionOptions, function (err) {
    if (err) console.log(err);
});

mongoose.connection.on('connecting', function () {
    console.log('Connecting to MongoDB...');
});

mongoose.connection.on('connected', function () {
    console.log('MongoDB connected!');
});

mongoose.connection.on('open', function () {
    console.log('MongoDB connection opened!');
});

mongoose.connection.on('error', function (err) {
    console.log(err);
    mongoose.disconnect();
});

mongoose.connection.on('disconnected', function () {
    console.log('MongoDB disconnected!');
    mongoose.connect('mongodb://XXXXXXXXXXXX@XXXXXX.mlab.com:57328,XXXXXXXX.mlab.com:57328/XXXXXXXXX?replicaSet=rs-XXXXXX', connectionOptions, function (err) {
        if (err) console.log(err);
    });
});

mongoose.connection.on('reconnected', function () {
    console.log('MongoDB reconnected!');
});

mongoose.connection.on('close', function () {
    console.log.error('MongoDB closed');
});

mongoose.connection.on('ha', function(type, data) {
    console.log('replset ha ' + type);
});

mongoose.connection.on('timeout', function () {
    console.log.error('MongoDB timeout');
});

我见过很多配置,我尝试了很多不同的东西,但似乎没有任何效果。

我非常感谢您的帮助,因为我一直在研究,但没有运气。

再次回顾一下,我有一个脚本正在运行从数据库中查询记录,一段时间后,该脚本将继续运行,但似乎找不到任何新记录并停止响应任何新数据。

【问题讨论】:

  • 我遇到了同样的问题,但仍然找不到解决方法。我有一个 linux CRON 调用一个端点,该端点每 15 分钟在 Mongo 中搜索数据。几个小时后,即使我可以在 shell 上手动执行该查询并获得结果,它也会停止返回数据。我已经快疯了。
  • 所以这种情况只发生在 cron 或者当你正常运行脚本时?
  • 它只发生在我的节点 API 中,目前正在使用 MongoDB 节点 JS 驱动程序。 cron 不断从这个 API 调用端点。几个小时后它停止工作,但我仍然可以将查询复制到 mongoDB shell,它会返回我所期望的。一旦我重新启动我的 API,端点就会再次开始工作,直到几个小时后问题再次发生。更多细节在这里:groups.google.com/forum/#!topic/mongodb-user/LkJV0ARHbV8
  • 你部署到heroku还是什么的?这是否与冷启动问题有关,即它没有响应实际上是服务器动态旋转?
  • 部署在 AWS EC2 上。就像上面链接中解释的那样,除了从我的聚合调用中获取数据之外,一切都很好。在服务器正常运行几个小时后,相同的查询不会返回任何内容,但是当复制到 Mongo shell 时,它会返回我期望的所有内容。如果我重新启动服务器,查询会再次运行,但几个小时后问题再次出现。

标签: node.js mongodb mongoose mlab


【解决方案1】:

不确定你的配置,但你可以试试我的:

  mongoose.connect(
  process.env.DB_CONNECT,
  {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
  },
  () => {
    console.log("Connected To MongoDB");
  }
);

【讨论】:

  • 我可以保证,我有相同的配置(除了我不使用 useCreateIndex)而且效果很好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多