Время подключения 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

}
Другие вопросы по тегам