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

时间:2014-04-17 19:29:15

标签: javascript node.js session

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

1 个答案:

答案 0 :(得分:0)

我将采用的方法是让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");
});

这只有在emit进程是同步的时候才会起作用(看起来可能是这样)。这意味着您无法获得回调,您只能广播该消息并让客户完成剩下的工作。

如果你想“硬刷新”,你可以轮询一个“心跳”路径,如果服务器是好的(并且显然在运行),那么它就会返回,然后进行location.reload()调用。对于软刷新,请ping返回新页面内容的路由,然后页面交换($("body").html(response))。