到Heroku的NodeJS中,MongoDB的MongoDB连接超时

首先一切正常,我可以通过发布到/上传路线成功地存储数据。 但在120秒不活动之后,超时事件触发,并且将来尝试存储数据失败。 但是callback没有被调用,所以在日志中没有"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); }); }); 

我基于这个例子松散的代码。 有人build议我在每次请求之后都打开一个到数据库的新连接,但这并不是从内部开始的最佳实践 , MongoClient.connect正在pipe理一个池。 我也试着改变一些这个选项。 仍然没有运气。

这解决了我的问题:

 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 }