【问题标题】:Trigger Event On Server Shutdown (NodeJS)服务器关闭时触发事件(NodeJS)
【发布时间】:2014-04-18 04:26:00
【问题描述】:

众所周知,当您更新 nodejs 文件并将其上传到您的服务器时,它需要重新启动才能应用 - 但如果您使用 nodemon 之类的东西,它会自动重新启动您的服务器,您的客户端已登录的用户需要刷新屏幕。

所以我想知道,有没有一种方法可以在我的服务器关闭/重新启动时触发“注销”,以便至少刷新客户端以便他们知道发生了什么?

就目前而言,他们会广播未定义的错误,因为他们的会话已丢失?

我尝试使用我称为authenticate的函数进行验证

function authenticate(req,res,next) {
    if (!req.session.loggedIn) {
        fs.readFile('./html/login.html', "utf8", function(err, html) {
            res.send(html);
        });
    } else next();
}

这是我调用函数的方式:

app.io.route('move', authenticate, function(req) {

但我的服务器崩溃了,因为此时参数未定义。

基本上将其视为onbeforeunload 事件,但不是浏览器,而是服务器。

【问题讨论】:

  • izuriel 我使用的是 socket.io,它嵌入在 express.io 中。我只是不知道如何检测重启
  • 我已经删除了我的 cmets 并用一个答案替换了它们以扩展我的意思。

标签: javascript node.js session


【解决方案1】:

我会采取的方法是让 Socket.IO 之类的东西通知所有连接的客户端您的服务器正在执行重新启动,这个重新启动通知一旦收到,将导致客户端断开套接字并轮询服务器返回向上。备份后,您可以进行硬刷新或软刷新。

Server                   Server                            
SIGINT/Exit received --> io.broadcast("server:restart") --

  Client                        Client
-> receive "server:restart" --> disconnect socket, poll for server back up --

  Client
-> load refreshed data

您可以捕获一些信号事件,如此处所示,并根据here 的一些信息,您可以使用“退出”事件。

process.on("exit", function() {
  app.io.sockets.emit("server:shutdown");
});

这只有在发射过程是同步的(看起来可能是同步的)时才有效。这意味着您无法获得回调,您只能广播消息并让客户端完成其余的工作。

如果您想“硬刷新”,您可以轮询一个“心跳”路由,如果服务器正常(并且显然正在运行)则返回该路由,然后执行location.reload() 调用。对于软刷新,ping 一条返回新页面内容然后页面交换的路由 ($("body").html(response))。

【讨论】:

  • 这在nodemon重启服务器时没有任何作用
  • 你是对的,看来 nodemon 发送了一个 SIGKILL 这不是你可以捕获的事件。
  • 该死,我被吓到了。不过谢谢你,我很感激你的帮助。顺便说一句,你在哪里找到的?我很想读这个
  • 我用一个小脚本在本地进行了测试。关于 Nodemon 的部分,我尝试监听 "exit""SIGTERM""SIGKILL"(出错)。当然,来自 Node.js 文档“SIGKILL 不能安装侦听器,它将无条件终止所有平台上的节点。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 1970-01-01
  • 2016-04-18
  • 2017-05-07
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多