最初はすべて動作し、/ uploadルートに投稿してデータを正常に保存できます。しかし、120秒間使用しないと、タイムアウトイベントが発生し、将来のデータの保存に失敗します。ただし、コールバックは呼び出されないので、ログには"Unable to insert..."
というメッセージはありません。MongoLabへのMongoDBの接続がHerokuのNodeJSでタイムアウトします
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に基づいています。毎回リクエスト後にDBに新しい接続をオープンすることを私に提案しましたが、is not best practice内部ではMongoClient.connect
がプールを管理しています。私はまた、thisに従っていくつかのオプションを変更しようとしました。まだ運がありません。
誰かは[こちら](http://stackoverflow.comしばらく前から同様の問題がありました/ questions/9670179/application-times-out-when-mongolab-from-heroku)を参照してください。 package.json内にノードとnpmエンジンの値を設定していますか? –
私は彼が持っているコードを試しました、そしてherokuはアプリをコンパイルすることを拒否しました。 'ノード0.6.12をダウンロードできませんでした。残念ながら、その解決策の作成者は、ノードとnpmをダウングレードすることを推奨しますが、何が修正されるのか説明していないので、次に試すバージョンがわかりません。 – charmoniumQ