2016-07-20 17 views
2

最初はすべて動作し、/ 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に従っていくつかのオプションを変更しようとしました。まだ運がありません。

+0

誰かは[こちら](http://stackoverflow.comしばらく前から同様の問題がありました/ questions/9670179/application-times-out-when-mongolab-from-heroku)を参照してください。 package.json内にノードとnpmエンジンの値を設定していますか? –

+0

私は彼が持っているコードを試しました、そしてherokuはアプリをコンパイルすることを拒否しました。 'ノード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

評価版shaosh – vincentjp

+0

も参照してください[こちら](https://blog.mlab.com/2014/04/mongodb-driver-mongoose/#Production-ready_connection_settings) – StephenT

関連する問題