3

我正在开发一个 Zappa 应用程序,我目前正在尝试制作一个小监视脚本来停止服务器,清除require.cache然后重新要求并在文件更改时重新启动服务器,例如:

# watch all dependent files
for file of require.cache
  fs.watch file, ->
    # attach a handler to 'close'
    # -- here's the issue: this takes far too long to trigger
    server.on 'close', ->
      server = require './server'
      server.start()

      # log the new server's id
      console.log server.id

    # stop the current server instance
    server.stop()

    # clear require's cache
    delete require.cache[f] for f of require.cache

我的请求处理程序中也有console.log server.id一行,因此我可以检查 ID 是否匹配。

所以,发生的事情是:当我改变一个依赖时,服务器停止,一个新的启动并且新的 ID 被记录,这都是肉汁。但是,在之后的随机时间内,对服务器的请求仍然记录旧 ID,表明旧的侦听器仍然以某种方式连接。最终,侦听器似乎“切换”并记录了新 ID。

更新:这似乎与close事件有关(不足为奇) - 如果我将一个简单的console.log 'close'回调附加到close事件,ID 在'close'出现后开始改变。但是,close触发事件可能需要很长时间(10s+),为什么需要这么长时间?

4

2 回答 2

3

根据node.js 文档

server.close()

停止服务器接受新连接。请参阅 net.Server.close()。

close因此,您的服务器将停止接受新连接,但在关闭当前连接之前它实际上不会关闭(并发出事件)。我的猜测是你有客户端连接到它,也许有keep-alive请求。

于 2012-02-17T13:01:35.853 回答
0

我正在寻找同样的问题。为您和其他搜索此解决方案的人提供:

如果这在您的项目中不是问题,您可以立即关闭所有连接。这完全解决了我的关闭问题。

app.use((req, res, next) => {
    res.setHeader('Connection', 'close');
    next();
});
于 2017-03-16T10:05:54.077 回答