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

标签 javascript node.js session

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

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

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

我尝试使用一个名为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

您可以捕获一些信号事件,如下所示,并基于一些信息 here您可以使用“退出”事件。

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

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

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

关于javascript - 服务器关闭时触发事件 (NodeJS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23141827/

相关文章:

c# - 如何创建 C# session 对象包装器?

php - 是什么让 php session 保持事件状态?

javascript - 在 jQuery 中使用数据属性对象作为选择器

node.js - express.json() 与正文解析器

php - 为什么我的 session 比我设置的时间更快到期?

javascript - Nodemon 重启运行 gulp 任务

node.js - 使用 Node 转换来自 Azure 表存储的响应

javascript - 如何监控输入的变化

javascript - 如何使用 for 循环遍历未知值

javascript - 传单 w/React : Individual country color won't re-render when this. Prop 更新,仅当鼠标悬停时发生?