2015-01-21 302 views
4

我有ExpressJs(版本4.X)服務器,我需要正確地停止服務器。由於有些請求可能需要很長時間(1-2秒),所以我必須拒絕新的連接並等待所有請求進行中的結束。在某些任務中間殺死服務器可能會使服務器處於不穩定狀態。如何正確關閉ExpressJs服務器?

我試過下面的代碼:

//Start 
var app = express(); 
var server = https.createServer(options, app); 
server.listen(3000); 


//Stop 
process.on('SIGINT', function() { 
    server.close(); 
}); 

然而,這個代碼不密切保持活動連接,有的客戶可以保留了連接很長一段時間。

那麼,我該如何正確關閉所有連接?

+0

如何使用中間件來控制它們是否被允許發出新的請求? – 2015-01-21 10:26:32

回答

4

如果服務器正在關閉,您可以使用一些中間件來阻止新的請求。

var app = express(), 
    shuttingDown = false; 

app.use(function(req, res, next) { 
    if(shuttingDown) { 
     return; 
    } 
    next(); 
}); 

var server = https.createServer(options, app); 
server.listen(3000); 

process.on('SIGINT', function() { 
    shuttingDown = true; 
    server.close(function(){ 
     process.exit(); 
    }); 
}); 
+1

如果在中間件中使用'return;',這是否會導致客戶端超時?它應該返回'服務器不可用的',或者甚至正確地完成容器不應該路由到這個應用程序的第一個地方,如果這是關閉。 – tsuz 2017-09-21 07:20:25