Время подключения MongoDB к MongoLab истекло в NodeJS на Heroku
Сначала все работает, и я могу успешно хранить данные, публикуя маршрут /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);
});
});
Я свободно основал свой код на этом примере. Мне было предложено, чтобы я открывал новое соединение с БД после каждого запроса, но это не лучшая практика, так как внутренне, MongoClient.connect
управляет бассейном. Я также попытался изменить некоторые параметры в соответствии с этим. Все еще не повезло.
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
}