繁体   English   中英

MongoDB mLab mongoose Node.js驱动程序 - 一段空闲时间后连接超时?

[英]MongoDB mLab mongoose Node.js driver - connection timeout after a period of idle time?

我有一个使用猫鼬与托管在MLAB Mongo的数据库连接简单的Node.js。

一切似乎工作得很好:添加新记录,查询现有的东西。

有时,经过一段时间的不活动,当我看到控制台时,我看到以下内容:

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

使用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;
});
  1. 您的互联网连接似乎有波动。 也许这就是连接超时的原因。
  2. 你可以通过设置超时来处理它。

如下 :

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

在你的app.js文件中

用以下代码替换你的mongoose连接设置:

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.                         
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM