起初一切正常,我可以通過發佈到/ 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的選項。仍然沒有運氣。
必須有人從前段時間有類似的問題[這裏](http://stackoverflow.com /問題/ 9670179 /應用程序超時的-時,連接到mongolab - 從 - Heroku的)。你是否在package.json中設置節點和npm引擎值? –
我嘗試了他的代碼,並且heroku拒絕編譯這個應用程序,指出'Unable to download node 0.6.12;它存在嗎?'不幸的是,該解決方案的作者建議降級節點和npm,但並不能解釋爲什麼這會修復任何問題,所以我不確定接下來要嘗試哪個版本。 – charmoniumQ