我遇到了使用以下内容构建的HTTP Node.js服务器的问题:
express=4.10.*
mongodb=1.4.34
正在使用以下中间件:
app.use(response_time());
app.use(body_parser.urlencoded({extended: true}));
app.use(body_parser.json());
var MongoClient = require('mongodb').MongoClient;
app.use(function (req, res, next) {
var connection_options = {auto_reconnect: false};
MongoClient.connect(config.server.db, connection_options, function (err, db) {
if (err) {
log.error(err); // Logging error.
return next(err);
}
req.db = db;
next();
});
});
服务器在20:40:10开始运行并成功处理了多个请求。
在02:59:02,每个请求都开始记录以下错误:
02:59:02.114Z ERROR CrowdStudy: failed to connect to [127.0.0.1:27017]
Error: failed to connect to [127.0.0.1:27017]
at null.<anonymous> (/home/ncphillips/Projects/crowdstudy/node_modules/mongodb/lib/mongodb/connection/server.js:555:74)
at emitThree (events.js:97:13)
at emit (events.js:175:7)
at null.<anonymous> (/home/ncphillips/Projects/crowdstudy/node_modules/mongodb/lib/mongodb/connection/connection_pool.js:156:15)
at emitTwo (events.js:87:13)
at emit (events.js:172:7)
at Socket.<anonymous> (/home/ncphillips/Projects/crowdstudy/node_modules/mongodb/lib/mongodb/connection/connection.js:534:10)
at emitOne (events.js:77:13)
at Socket.emit (events.js:169:7)
at emitErrorNT (net.js:1237:8)
我最初的怀疑是,我认为连接池已经填满,因为我没有办法处理呼叫req.db.close()
。我认为传递选项{auto_reconnect: false}
可以通过在一段时间后自动关闭连接来解决这个问题,但似乎我错了。
请注意,重新启动服务器可以解决问题,所以我认为问题与Node而不是Mongo有关。
如果这与连接池有关,是否有一些我可以通过的设置来解决这个问题,或者我是否有一个终端软件可以确保连接始终关闭?
非常感谢能帮助我的人!
答案 0 :(得分:1)
autoReconnect
是一个应该传递给服务器配置的选项:
MongoClient.connect(config.server.db, {
server : { autoReconnect : false }
}, ...);
documentation包含一些错误:它指出默认设置为false
(它不是),并且还声明应在被调用的对象中设置autoReconnect
socketOptions
(不应该)。
您可以向传回的db
对象添加各种事件侦听器,以检测与数据库的连接何时关闭/重新连接/...:
db.on('close', function(reason) { ... });
db.on('reconnect', function(db) { ... });
更多活动here。