Javascript 节点JS+;Express JS:从其他位置刷新页面

Javascript 节点JS+;Express JS:从其他位置刷新页面,javascript,node.js,express,Javascript,Node.js,Express,我有以下问题:我想更改页面上的一个变量。输入来自另一个页面,因此: 我使用Node.js、Express.js和Ejs来完成这个任务 服务器-存储值 索引页-带有输入字段和发送按钮的控制页 显示页面-显示变量 我正在将带有fetch post的变量发送到服务器。在服务器上,我使用请求正文值更改变量,当我手动重新加载“显示页面”时,我会看到新值。问题是:我需要在没有任何手动刷新或其他事情的情况下更改它,因为这是不可能的 “location.reload()”有可能每X秒刷新一次。但这不是我想要

我有以下问题:我想更改页面上的一个变量。输入来自另一个页面,因此:

我使用Node.js、Express.js和Ejs来完成这个任务

  • 服务器-存储值
  • 索引页-带有输入字段和发送按钮的控制页
  • 显示页面-显示变量
我正在将带有fetch post的变量发送到服务器。在服务器上,我使用请求正文值更改变量,当我手动重新加载“显示页面”时,我会看到新值。问题是:我需要在没有任何手动刷新或其他事情的情况下更改它,因为这是不可能的

“location.reload()”有可能每X秒刷新一次。但这不是我想要使用的方式,我真的只想在变量更改时刷新它。是否有一个函数(例如来自express.js)可供我使用


编辑:我应该提到,这个项目将只是在我们的网络中使用,它不会对其他用户开放。就像公司内部的仪表板一样。
因此,一个“快速而肮脏”的解决方案也可以奏效,但我想学习一些东西,并希望以正确的方式来做。

想到的最简单的解决方案是让服务器返回正文中更新的帖子,然后用它来更新页面


您还可以阅读有关长/短轮询和WebSocket的内容。

一个可能的解决方案是在使用fetch成功完成post操作后添加页面重新加载代码

fetch(url, {
    method: 'post',
    body: body
  }).then(function(response) {
    return response.json();
  }).then((data) => {
        // refresh page here
        window.location.replace(url);
  });

这是一个非常常见的场景,有几种解决方案:

  • 轮询显示页面每隔N秒循环运行ajax调用,询问服务器变量的最新版本。这很容易实现,非常常见,并且完全可以接受。然而,它有点过时,而且有更现代、更有效的方法。我建议你先试试这个,只在需要的时候再看其他的
  • WebSocket-WebSocket维护客户端和服务器之间的连接。这允许服务器在需要时向客户端应用程序发送消息。这些设置比普通的ajax调用要复杂一些,但是如果有很多消息来回发送,那么它们的效率会更高
  • WebRTC-这将它提升到了另一个层次,对于您的用例来说,这无疑是一种过度的杀伤力。WebRTC允许客户端之间的直接消息传递。它的配置比WebSocket更复杂,主要用于客户端之间的音频或视频流。不过,它也可以发送简单的文本消息。从技术上讲,如果您希望将消息持久化到服务器上,那么这根本不合适,但值得一提的是,您需要提供可用消息的完整图片
  • 正确的解决方案(WebSocket):

  • 将WebSocket服务器添加为Node.JS应用程序的一部分
  • 实现WebSocket的订阅,实现函数“状态已更改”
  • 从客户端浏览器应用订阅“状态已更改”方法
  • 当变量更改时,从express应用程序调用ws-server以更新客户端
  • 过时(轮询):

  • 从您的服务器添加快速端点路由:“变量状态”呼叫服务器

  • 客户端每n毫秒一次,检查变量状态是否更改

  • 如果变量已更改,请刷新页面


  • 这是一个很好的建议,可以使用web套接字来解决这个问题;但我必须给端点打一次电话才能看到变化。不过我会看看WebSocket。我可以每x秒刷新一次,但在我看来这太“脏”了。根据你网站的规模,“适当”的解决方案可能会变糟,“快速而糟糕”的解决方案可以挽救一天。对我们大多数人来说,WebSocket每次都会赢。但是,如果你在谷歌或Netflix规模上工作,你可能会发现来自数百万(而不是数百)客户端的持久开放套接字将使你的操作系统缺少开放文件描述符。在这一点上,通过ajax进行轮询要多得多scaleable@slebetman我不能同意你的意见。你不应该仅仅因为世界上最大的网站之一有问题就推荐过时的东西。大多数用户都有另一个用户案例,尤其是当他们在这里问这类问题时。此外,还有一种使用WS订阅和取消订阅的方法,您可以关闭与WS的连接,您可以使用很少的WS-MicroService来处理不同的页面。所以这不是一个技术问题,这是一个技术问题。我应该提到的是,这个项目只会在我们的网络中使用,不会对其他用户开放。就像公司内部的仪表板一样。所以,一个“快速而肮脏”的解决方案也可以奏效,但我想学点东西,并且想用正确的方式去做。就像我刚才说的。你需要了解你的工具。Websockets更新效率更高,Linux上约有500个并行套接字(如果配置操作系统,则最高可达5000个),Win10上约有4000个并行套接字(或早期Windows上约有200个)。在这之后,ajax循环比WebSocketsOn Linux更高效,您可以将最大文件描述符的数量增加到超过100000个打开的连接(请记住,这些连接还与stdin/stdout和磁盘上的打开文件共享描述符)但是,如果文件描述符的数量太多,您可能会遇到无法预测的性能问题。不确定是否可以配置windows,因为如果在页面加载时调用源代码,则该数字似乎是在源代码中定义的,如果服务器返回2xx,则这将导致页面在无限循环中重新加载-效率非常低,更不用说使页面无法使用。不过,您的思路是正确的。只是不要重新加载页面。更新本地状态instea