【发布时间】:2015-09-09 02:14:48
【问题描述】:
我正在尝试在应用关闭时正确关闭 MongoDB 连接。代码如下:
var express = require('express')
, http = require('http')
, mongoose = require('mongoose')
, path = require('path');
var app = express();
app.set('port', process.env.PORT || 3000);
mongoose.connect('mongodb://localhost/test');
// some post and get handlers etc. (removed for shorter output)
var server = app.listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
function cleanup () {
server.close(function () {
console.log("Closed out remaining connections.");
mongoose.connection.close();
process.exit();
});
setTimeout( function () {
console.error("Could not close connections in time, forcing shut down");
process.exit(1);
}, 30*1000);
}
process.on('SIGINT', cleanup);
process.on('SIGTERM', cleanup);
当应用程序第一次启动时,一切都很好并且工作正常。当我在它启动后立即点击Ctrl-c 时,它会干净地关闭并显示Closed out remaining connections. 消息。但是,一旦应用程序与数据库交互甚至提供静态页面,然后我尝试将其关闭,它就会退出并出现以下错误:
net.js:1225
throw new Error('Not running');
^
Error: Not running
at Server.close (net.js:1225:11)
at process.cleanup (<...>/app.js:77:12)
at process.EventEmitter.emit (events.js:92:17)
at Signal.wrap.onsignal (node.js:756:46)
22 Aug 15:15:28 - [nodemon] exiting
任何想法是什么导致了这个错误以及我该如何解决它?
【问题讨论】:
-
在提供静态页面后,是否需要按两次 ctrl-c 才能看到此错误,而不是在未完成提供服务的情况下。
-
不,只有一个
Ctrl-c。 -
服务器没有关闭的原因是因为有剩余的套接字是打开的。您必须跟踪它们并一一关闭它们。要更好地了解该过程并了解如何管理套接字,请阅读dev.to/gajus/how-to-terminate-a-http-server-in-node-js-ofk。
标签: node.js mongodb express application-shutdown