服务器关闭时触发事件(NodeJS)

Trigger Event On Server Shutdown (NodeJS)

本文关键字:事件 NodeJS 服务器      更新时间:2023-09-26

众所周知,当您更新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事件,而不是浏览器,而是服务器。

我要采取的方法是让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

您可以捕获一些信号事件,如这里所示,并根据这里的一些信息使用"退出"事件。

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

只有当发射过程是同步的(看起来可能是同步的),这才会起作用。这意味着你不能得到一个回调,你只能广播消息,让客户端做剩下的事情

如果你想"硬刷新",你可以轮询一个"心跳"路由,该路由只返回服务器是否良好(显然是正在运行),然后执行location.reload()调用。对于软刷新,请ping返回新页面内容的路由,然后进行页面交换($("body").html(response))。