2016-07-20 46 views
2

起初一切正常,我可以通過發佈到/ upload路徑成功存儲數據。但是在120秒不活動之後,超時事件觸發,並且未來嘗試存儲數據失敗。但是回調沒有被調用,所以日誌中沒有"Unable to insert..."消息。到Heroku上的NodeJS超時的MongoLab的MongoDB連接

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的選項。仍然沒有運氣。

+0

必須有人從前段時間有類似的問題[這裏](http://stackoverflow.com /問題/ 9670179 /應用程序超時的-時,連接到mongolab - 從 - Heroku的)。你是否在package.json中設置節點和npm引擎值? –

+0

我嘗試了他的代碼,並且heroku拒絕編譯這個應用程序,指出'Unable to download node 0.6.12;它存在嗎?'不幸的是,該解決方案的作者建議降級節點和npm,但並不能解釋爲什麼這會修復任何問題,所以我不確定接下來要嘗試哪個版本。 – charmoniumQ

回答

2

這解決了我的問題:

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 

} 
+0

非常感謝你的兄弟。你節省了我的一天。 – shaosh

+0

Awesomeness shaosh – vincentjp

+0

另請參閱[這裏](https://blog.mlab.com/2014/04/mongodb-driver-mongoose/#Production-ready_connection_settings) – StephenT

相關問題