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