在 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