【发布时间】:2016-11-23 23:49:26
【问题描述】:
起初一切正常,我可以通过发布到 /upload 路由成功地存储数据。但在 120 秒不活动后,超时事件会触发,并且未来存储数据的尝试会失败。但是没有调用回调,因此日志中没有"Unable to insert..." 消息。
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 更改一些选项。还是没有运气。
【问题讨论】:
-
不久前有人遇到过类似的问题here。您是否在 package.json 中设置 node 和 npm 引擎值?
-
我尝试了他的代码,但 heroku 拒绝编译应用程序并声明
Unable to download node 0.6.12; does it exist?不幸的是,该解决方案的作者建议降级 node 和 npm,但没有解释为什么会解决任何问题,所以我不确定接下来要尝试哪个版本。
标签: node.js mongodb heroku mlab