【问题标题】:MongoDB mLab mongoose Node.js driver - connection timeout after a period of idle time?MongoDB mLab mongoose Node.js 驱动程序 - 一段空闲时间后连接超时?
【发布时间】:2016-12-20 13:49:12
【问题描述】:

我有一个简单的 Node.js,它使用 mongoose 连接 mLab 上托管的 Mongo 数据库。

一切似乎都很好:添加新记录、查询现有内容。

只是有时,在一段时间不活动后,当我查看控制台时,我会看到以下内容:

events.js:160
      throw er; // Unhandled 'error' event
      ^

Error: connection timeout
    at Db.<anonymous> (___PATH___/node_modules/mongoose/lib/drivers/node-mongodb-native/connection.js:168:17)
    at emitTwo (events.js:106:13)
    at Db.emit (events.js:191:7)
    at Server.listener (___PATH___/node_modules/mongodb/lib/db.js:1786:14)
    at emitOne (events.js:96:13)
    at Server.emit (events.js:188:7)
    at Server.<anonymous> (___PATH___/node_modules/mongodb/lib/server.js:274:14)
    at emitOne (events.js:96:13)
    at Server.emit (events.js:188:7)
    at Pool.<anonymous> (___PATH___/node_modules/mongodb-core/lib/topologies/server.js:334:12)
    at emitOne (events.js:96:13)
    at Pool.emit (events.js:188:7)
    at Connection.<anonymous> (___PATH___/node_modules/mongodb-core/lib/connection/pool.js:270:12)
    at Connection.g (events.js:292:16)
    at emitTwo (events.js:106:13)
    at Connection.emit (events.js:191:7)

现在这对我来说并不重要 - 我总是可以重新启动应用程序。我担心在生产中会引起很多头痛,所以我先发制人地问这里有什么问题?

请注意,最初一切正常,过了一段时间我收到Error: connection timeout

【问题讨论】:

  • 即使我面临同样的问题,有什么突破吗?
  • @CleanCrispCode 推动了支持...过去几天我没有在处理这段代码。
  • 你有什么解决办法吗? @MichalStefanow
  • 我怀疑这可能是我的电脑进入睡眠状态。 - 是的,当你的电脑进入睡眠状态时,它可能会关闭它打开的连接套接字您的 mLab 数据库。 - * 我建议您从与 mLab 数据库相同的云数据中心开始测试您的应用程序。这样,您的应用程序就不会受到您的计算机是否处于活动状态的影响,并且您还可以从延迟和安全角度受益:docs.mlab.com/security/#network* - 没有想法...没有彻底测试。

标签: node.js mongodb mongoose


【解决方案1】:

使用 Mongoose 的 Mongo-Node 连接代码示例

var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');

const options = {
    useMongoClient: true,
    reconnectTries: 5000,
    reconnectInterval: 0,
    socketTimeoutMS: 100000,
    connectTimeoutMS: 100000
  }

mongoose.connect(mongodb://........, options);
var db = mongoose.connection;

db.on('error', function (error) {
  console.log('Error while connecting to mongodb database:', error);
});

db.once('open', function () {
  console.log('Successfully connected to mongodb database');
});

db.on('disconnected', function () {
  //Reconnect on timeout
  mongoose.connect(mongodb://........, options);
  db = mongoose.connection;
});

【讨论】:

    【解决方案2】:
    1. 您的互联网连接似乎有波动。这可能是连接超时的原因。
    2. 您可以通过设置超时来处理它。

    如下:

    var timeout = require('connect-timeout');
    app.use(timeout('5s'));`
    

    在您的app.js 文件中

    【讨论】:

    • “您的互联网连接波动” - 会不会是电脑进入休眠状态?我刚从散步回来,也是一样的东西:Error: connection timeout
    • 本应帮助 Mongoose 在故障转移后连接到辅助节点的高可用性检查未正确运行。由于某种竞争条件,如果服务器在初始化 Mongoose 连接后需要一段时间才能启动,则在 mongodb-core 中启动检查的回调会失败。我最终发现的是将 Mongoose 连接尽可能晚地移动到服务器启动过程中。它曾经是在一个非常大的文件缩小任务之前,这可能是问题所在。希望这会有所帮助!
    • @ShekharTyagi 您介意通过显示一些示例代码来详细说明您的解决方案吗?谢谢。
    • hi @user6860460 ,您可以在网站上查看示例,请查看。 github.com/expressjs/timeout
    【解决方案3】:

    用此代码替换您的猫鼬连接设置:

    var mongoose = require('mongoose');
    
    /* 
     * Mongoose by default sets the auto_reconnect option to true.
     * We recommend setting socket options at both the server and replica set level.
     * We recommend a 30 second connection timeout because it allows for 
     * plenty of time in most operating environments.
     */
    var options = { server: { socketOptions: { keepAlive: 300000, connectTimeoutMS: 30000 } }, 
                    replset: { socketOptions: { keepAlive: 300000, connectTimeoutMS : 30000 } } };       
    
    var mongodbUri = 'mongodb://user:pass@host:port/db';
    
    mongoose.connect(mongodbUri, options);
    var conn = mongoose.connection;             
    
    conn.on('error', console.error.bind(console, 'connection error:'));  
    
    conn.once('open', function() {
      // Wait for the database connection to establish, then start the app.                         
    });
    

    【讨论】:

    • @KrishnanKantSharma:当你在conn.once('open', function()部分用var app = express()启动应用程序时,你如何导出app以用于后面代码中的其他语句(例如app.use) ?如果不导出 app,我在尝试启动 express 应用时收到 ReferenceErrorL: app is not defined 错误。
    • @user6860460 将您的快递应用导出为module.exports = app。然后在您的 MongoDB 连接文件中使用它,例如:const app = require("../your express app file path"); app.set("port", process.env.PORT || 8080 ); const server = app.listen(app.get("port"), function() { console.log("Express server listening on port " + server.address().port); });
    猜你喜欢
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 2012-04-02
    • 2020-04-29
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多