Express服务器无法关闭。

8
我正在创建一个可重新加载的端点的Express服务器。
为了实现这个目的,我创建了一个专门用于此目的的端点。
但是,当我在Express的HTTP服务器上调用server.close()时,它仍然在继续监听,而server.listening却显示不是。
下面是我的脚本的简化版本(尚未完全工作,但您可以理解其中的要点):
class simpleServer {
    constructor() {
         let express = require('express');
         this.app = express();
         this.app.get('/reload', this.reload);
         this.server = this.app.listen(3000);
    }

    reload(req, res) {
         console.log('Closing server');             

         this.server.close(function() {
             console.log('Closed server');
         });
         
         // Re-init & stuff

         res.json({
             message: 'Reloaded'
         });
    }
}

let server = new simpleServer();

当我调用端点时,服务器将输出“关闭服务器”,但是“关闭服务器”需要很长时间才能被调用(5分钟)。当我重新加载页面时,它仍然可以工作,而server.listening等于false
我使用的是Node.js版本6.0.0和Express版本4.14.0
一些更新:
我通过在发送响应后调用req.destroy()来解决问题,这会有任何副作用吗?
更干净的解决方法是保持当前连接的记录,并在重新加载函数中关闭这些连接,而不是立即关闭它们。如果您的负载较高,这可能会更轻便。
2个回答

11

当你调用 .close() 时,它只停止接受新的连接,而不会终止现有的连接。

如果存在已经设置了 Connection: keep-alive 的现有连接以便进行更多请求,则关闭可能需要一些时间。


那么连接会保持打开状态,即使我发送了响应? - lorenzo373
2
是的,如果客户端请求了Connection: keep-alive。这是HTTP/1.1的一个功能,用于减少每个HTTP请求的连接创建和撤销的开销。 - mscdex
@lorenzo373 关于强制关闭连接的现有问题,Joshua Wise提供了一个有趣的答案,可以优雅地处理保持活动请求。 - Gimby

-2

你可以使用 process.exit()。

或者你可以尝试

this.server.close(function() {
   console.log('Closed server');
})();

这不是我想要实现的。 - lorenzo373

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接