【问题标题】:How can I access the browser's window object from a nodejs application?如何从 nodejs 应用程序访问浏览器的窗口对象?
【发布时间】:2016-01-23 16:04:23
【问题描述】:

我正在尝试编写一个简单的应用程序来监视文件更改并在浏览器中自动重新加载更新的代码。我知道 livereload nodeamon 和其他人的存在,我只是想自己写。我已经创建了服务器,让它读取我想要读取的文件,调用 watcher,当被监视的文件发生更改时,它会杀死并重新启动服务器。最后一部分:它应该刷新浏览器。这怎么可能?

【问题讨论】:

  • 访问window对象服务器端的用例是什么?
  • 我希望它在浏览器中重新加载页面
  • 那么你可能想使用redirect()
  • 我认为 redirect() 只存在于 Express 中...有没有办法可以在本机节点 js 应用程序中重定向页面?
  • redirect()response.writeHead(302, { 'Location': url }); 的包装器,因此您可以尝试使用它。

标签: javascript node.js browser web


【解决方案1】:

正如其他人所解释的,浏览器编程环境以及 window.location.reload() 与 node.js 完全分离,因此您不能直接从 node.js 调用它。服务器端代码在 node.js 中的服务器上运行。浏览器中的客户端代码仅在浏览器中运行。两者可以通过 Ajax 请求或通过 webSocket 连接发送的消息进行通信,但它们不能直接相互调用代码。


要让浏览器根据服务器上的变化进行刷新,有两种基本方法。

  1. 浏览器中的 Javascript 可以定期询问服务器是否有任何新内容(通常使用传递时间戳的 Ajax 调用)。如果服务器说自从那个时间戳之后有新的东西,那么浏览器中的 Javascript 可以请求新的数据/文件。这种“轮询”方法并不是特别有效,因为如果数据不经常更改,那么大多数对新事物的请求只会返回没有新事物。这对电池寿命也不友好。

  2. 浏览器可以与服务器建立持久的 webSocket 连接。然后,当服务器发现服务器上发生了某些变化时,它可以直接向每个连接的浏览器发送通知,通知它有新的变化。然后,所有收到此消息的连接客户端都可以进行正常的 Ajax 调用以检索新数据。或者,新信息可以直接通过 webSocket 发送到客户端。无论哪种情况,这种直接通知通常都比“轮询”解决方案更有效。

使用 webSocket 选项,您将不希望您的服务器重新启动,因为这将断开所有 webSocket 连接。我不确定为什么您当前要在某些更改时重新启动服务器,但是您必须更改它才能使用 webSocket 解决方案。

【讨论】:

    【解决方案2】:

    NodeJS 没有代表全局命名空间的window 变量。相反,它有一个名为 global 的变量。

    NodeJS 中没有浏览器、窗口或 URL 位置。

    这是一个纯粹的服务器端工具。

    【讨论】:

    • 如果我想从我的节点应用程序重新加载浏览器中的页面怎么办?
    【解决方案3】:

    在 node.js 中,process 是一个 node.js 全局对象,就像 window 是一个浏览器全局对象。

    如需更多信息,请在 node.js shell 中输入 process

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-23
      • 1970-01-01
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多