2016-07-20 17 views
2

Zuerst funktioniert alles, und ich kann erfolgreich Daten speichern, indem Sie auf die/Upload-Route buchen. Aber nach 120 Sekunden Inaktivität wird das Zeitüberschreitungs-Ereignis ausgelöst, und zukünftige Versuche, Daten zu speichern, schlagen fehl. Der Rückruf wird jedoch nicht aufgerufen, daher gibt es keine Nachricht "Unable to insert..." im Protokoll.MongoDB Verbindung zu MongoLab Zeitüberschreitung in NodeJS auf Heroku

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); 
    }); 
}); 

ich anhand meines Code locker weg von this example. Es wurde mir vorgeschlagen, dass ich nach jeder Anfrage eine neue Verbindung zur DB öffne, aber diese is not best practice seit intern MongoClient.connect verwaltet einen Pool. Ich habe auch versucht, einige der Optionen nach this zu ändern. Immer noch kein Glück.

+0

Jemand hatte ein ähnliches Problem von vor einer Weile [hier] (http://stackoverflow.com/questions/9670179/Anwendungs-Time-Out-wenn-Verbindung-zu-Mongolab-von-Heroku). Setzen Sie die Werte für den Knoten und die npm-Engine in package.json? –

+0

Ich habe den Code ausprobiert, den er hat, und heroku weigert sich, die App zu kompilieren, die besagt, dass Knoten Knoten 0.6.12 nicht heruntergeladen werden kann; existiert es? 'Leider empfiehlt der Autor dieser Lösung das Herunterstufen von Node und Npm, aber erklärt nicht, warum das irgendetwas behebt, also bin ich mir nicht sicher, welche Version ich als nächstes ausprobieren soll. – charmoniumQ

Antwort

2

Dies löste das Problem für mich:

var options = { 
    server: { 
    socketOptions: { 
     keepAlive: 300000, connectTimeoutMS: 30000 
    } 
    }, 
    replset: { 
    socketOptions: { 
     keepAlive: 300000, 
     connectTimeoutMS : 30000 
    } 
    } 
}; 

es dann setzen sich hier ein:

if(process.env.MONGODB_URI) { 
    mongoose.connect(process.env.MONGODB_URI, options); 
} else { 

    // Connect to local database 

} 
+0

Vielen, vielen Kumpel. Du sparst meinen Tag. – shaosh

+0

Awesomeness shaosh – vincentjp

+0

Siehe auch [hier] (https://blog.mlab.com/2014/04/mongodb-driver-mongoose/#Production-ready_connection_settings) – StephenT