【问题标题】:MongoDB connection to MongoLab timing out in NodeJS on Heroku在 Heroku 上的 NodeJS 中,MongoDB 与 MongoLab 的连接超时
【发布时间】:2016-11-23 23:49:26
【问题描述】:

起初一切正常,我可以通过发布到 /upload 路由成功地存储数据。但在 120 秒不活动后,超时事件会触发,并且未来存储数据的尝试会失败。但是没有调用回调,因此日志中没有"Unable to insert..." 消息。

var express = require('express');
var bodyParser = require('body-parser');
var winston = require('winston');
var config = require('./config');
var MongoClient = require('mongodb').MongoClient;

var app = express();

app.use(bodyParser.json());

app.post('/upload', function (req, res) {
  req.json({status: 'recieved'});
  req.app.locals.db.collection('data').insertOne(req.body, function(err, result) {
    if (err === null) {
      winston.info('Successfully inserted', {data: req.body});
    } else {
      winston.warn('Unable to insert', {cause: err});
    }
  });
});

const options = {
  server: {
    socketOptions: {
      keepAlive: 1,
      autoReconnect: true,
      connectTimeoutMS: 5000
    }
  }
};

MongoClient.connect(config.databaseURI, function(err, db) {
  if (err !== null) {
    winston.error('Could not connect to database', {cause: err});
    return;
  }

  db.on('timeout', function (err) {
    winston.error('Mongo timed out', {cause: err});
  });

  app.locals.db = db;
  app.listen(config.port, function() {
    winston.info('Listening on port %d', config.port);
  });
});

我的代码松散地基于this example。有人建议我在每次请求后打开一个与数据库的新连接,但是这个 is not best practice 在内部,MongoClient.connect 正在管理一个池。我还尝试根据this 更改一些选项。还是没有运气。

【问题讨论】:

  • 不久前有人遇到过类似的问题here。您是否在 package.json 中设置 node 和 npm 引擎值?
  • 我尝试了他的代码,但 heroku 拒绝编译应用程序并声明 Unable to download node 0.6.12; does it exist? 不幸的是,该解决方案的作者建议降级 node 和 npm,但没有解释为什么会解决任何问题,所以我不确定接下来要尝试哪个版本。

标签: node.js mongodb heroku mlab


【解决方案1】:

这为我解决了问题:

var options = { 
  server: { 
    socketOptions: { 
      keepAlive: 300000, connectTimeoutMS: 30000 
    } 
  }, 
  replset: { 
    socketOptions: { 
      keepAlive: 300000, 
      connectTimeoutMS : 30000 
    } 
  } 
};

然后放在这里:

if(process.env.MONGODB_URI) {
  mongoose.connect(process.env.MONGODB_URI, options);
} else {

  // Connect to local database

}

【讨论】:

  • 非常感谢老兄。你拯救了我的一天。
  • 太棒了 shaosh
  • 另见here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 2016-12-05
  • 2015-06-15
  • 2018-07-23
  • 2017-12-18
  • 2015-02-07
  • 2018-01-07
相关资源
最近更新 更多