gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:35:03 24 4
gpt4 key购买 nike

众所周知,当您更新 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com