2

这是一个基本代码笔的链接,它将<input>标签与 Gun 实例同步,并将 Gun 更新连接到 React setState。
https://codepen.io/anon/pen/weJxNO?editors=0011

我的期望:
当您在多个窗口中打开程序时,您可以在一个窗口中键入并在其他窗口中查看更新。在一个窗口中输入会改变 Gun store,然后导致所有实例传播事件,从而跨窗口重新渲染所有 React 组件。

实际发生的情况:
如果您在多个窗口中打开程序,请注意在一个窗口中键入会更改所有窗口的 localStorage 值。然而,只有您实际输入的窗口才会记录来自 Gun 商店的事件。

可能的解决方案:
我知道我可以在所有客户都与之通信的服务器上设置一个 Gun 实例。但这不是与 Gun 的目的背道而驰吗?p2p 系统的优点是您不需要中央权威来源。

问题重述:
我如何连接程序以使所有 Gun 实例触发更改事件,从而在没有中央服务器的情况下跨窗口更新每个 React 组件?

来自 Codepen 的相关代码:

class App extends React.Component {
  constructor() {
    super()
    this.state = {name: ''};
    this.gun = Gun()
  }

  componentDidMount() {
    this.gun.get('user').on(
      ({ name }) => 
        this.setState({ name }))
  }
  render() { 
    return <div>
      <h1>Hey, {this.state.name || '(your name here)'}</h1>
      <input 
        value={this.state.name}
        placeholder="edit your name here"
        onChange={({ target }) => 
          this.gun.get('user')
             .put({ name: target.value })}
       />
      <p>you should see updates in multiple browser windows</p>
      <p>you can see your localStorgae update every time you type in other windows</p>
      <p>but the state is only set when you type in this window</p>
    </div>
  }
}
4

3 回答 3

3

虽然 WebRTC 仍然需要一个信令服务器,但不幸的是浏览器(不是 GUN)仍然需要 1+ 个中继节点。

可以在非浏览器对等点上使用 GUN 进行 P2P 更新,而无需中央服务器。浏览器的 P2P 能力有限,这不是 GUN 的错。

于 2018-07-09T17:28:08.887 回答
0

所以根据 Gun 的入门指南:https ://github.com/amark/gun/wiki/Getting-Started-%28v0.3.x%29#how-to

为了在两个对等方之间同步数据,您至少需要一台枪服务器。

因此,我的问题中的预期行为是不可能的,并且期望是基于对技术的误解 - 部分受到文档的启发。

我的误解是分布式系统的含义,如此处所述https://github.com/amark/gun#why

GUN 在设计上是对等的,这意味着您无需维护中央数据库服务器,否则可能会崩溃。这可以让您彻夜难眠,而不必担心数据库 DevOps - 我们称之为“NoDB”。

这条评论最初让我在前一条评论旁边感到困惑。如果我需要至少一台枪支服务器来获得实时更新的连接,那么这台服务器有时会崩溃并破坏我的应用程序吗?

答案是,如果您的服务器崩溃,那么您的实时网桥当然会中断。但您的数据不会被破坏。因为当最终使用分布式冲突解决算法重新建立连接时,用户将全部将数据联合回彼此。如需对此的更多了解,请观看此 Gun 的创建者使用 Gun 进行实时编程的视频:https ://youtu.be/qJNDplwJ8aQ?list=PL9EMvPaQlrL9mgmihQNcKdqmZTcmxFG__

您可以在此 stackoverflow 问题的答案末尾找到关于为什么需要 Gun 服务器将消息中继到所有客户端的简要技术说明:关于 gunDB 作为 Cordova 项目的独立数据库的具体问题

*WebRTC 需要 STUN/ICE/信令服务器来引导 WebRTC 连接。这太烦人了。这意味着即使 WebRTC 是 P2P,为了获得连接,您必须通过一些服务器,这必须为每次页面加载感到高兴。正因为如此,我们默认将 gun 与 websockets/JSONP 捆绑在一起,它必须连接到 gun 中继服务器对等点(也有社区 gun relay peer 可供人们用于个人实验,但很容易运行您自己的在第 4 点)。结果,我们还没有发布 WebRTC 适配器,尽管事实上 WebRTC + gun 非常适合 - 愚蠢的 STUN/ICE/信令服务器。

于 2017-06-21T06:42:26.707 回答
0

您可能想要订阅本地存储中的更改事件。看看这里:

https://developer.mozilla.org/en-US/docs/Web/Events/storage

于 2017-06-19T23:18:59.980 回答