在 Heroku 上的 NodeJS 中,MongoDB 与 MongoLab 的连接超时

Posted

技术标签:

【中文标题】在 Heroku 上的 NodeJS 中,MongoDB 与 MongoLab 的连接超时【英文标题】:MongoDB connection to MongoLab timing out in NodeJS on Heroku 【发布时间】: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,但没有解释为什么会解决任何问题,所以我不确定接下来要尝试哪个版本。 【参考方案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

以上是关于在 Heroku 上的 NodeJS 中,MongoDB 与 MongoLab 的连接超时的主要内容,如果未能解决你的问题,请参考以下文章

Heroku 上的 forge.tutorial.viewhubmodels.nodejs 教程 401(未经授权)

如何通过部署在 Heroku 上的 Nodejs/Nestjs 服务器为我的 Angular 前端提供服务?

Heroku 应用程序 EACCES 上的 Nodejs Express 0.0.0.0:80

Firebase Angular 应用程序未连接 Heroku 上的 h NodeJS 应用程序

Heroku 上的 Node JS 消息队列

Socket.io + NodeJS 不适用于 Heroku