0

我认为服务器中的 gun 实例也是同行之一。但是当我把数据放到服务器上的时候,对端是拿不到数据的。

这是我的简单测试代码。

global.gun.get('servertest').put('yes'); // at server side
gun.get('servertest').once(console.log); // at client side

它打印undefined。请让我知道如何在服务器端使用枪实例。

4

3 回答 3

0

在服务器上,运行此命令以实际接受远程连接:

var server = require('http').createServer().listen(8080);
var gun = Gun({web: server});

在客户端上,运行此命令以连接到您的服务器:

var gun = Gun({peers: ["http://server-ip-or-hostname:8080/gun"]})

附带说明一下,即使您建立对等连接来获取数据,您仍然需要处理undefinedonce()因为数据进入时可能会触发多次。

相关链接:


编辑:为了更明确地说明我上面的旁注——您的客户端获取非本地数据once的回调实际上是设计使然。这意味着客户端还没有可用的请求数据。然而,它会从它的对等点请求它,它会尝试用他们自己可以解决的问题(本地或从他们各自的对等点)来回答。这些答案将再次触发回调(如果他们通过了我认为的 CRDT 算法)。undefined

登陆undefined客户端也可能意味着服务器的响应可能已经超时,而 GUN 认为它没有得到响应。您可以使用 延长等待时间.once(callback_function, {wait: time_in_miliseconds})

根据 Hadar 的回答,尝试使用on()而不是once()缓解竞争条件,即您的客户端在您实际编写数据之前从服务器请求数据。一旦你得到你的数据并且不想要任何更新,你可以取消订阅gun.get('servertest').off()

此外,值得注意的是GUN 实例并没有神奇地链接;将它们中的两个连接起来并不意味着它们在任何方面都是相同的。从概念上讲,它们是分布式系统中的对等点,在 GUN 的情况下,这为您提供了与所有限制和权衡相关的最终一致性。

于 2020-02-26T09:48:02.200 回答
0

尝试gun.on而不是once. on 将订阅所有更改。如果您.once仅在向服务器写入内容后运行,您的示例应该可以工作。在客户端上使用gun.on应该无论如何都可以工作,并且会在服务器写一些东西的那一刻触发

于 2020-02-26T10:16:22.303 回答
0

@skiqh

您好,感谢您的回答。我在服务器和客户端都很好地启动了枪实例。

  1. 服务器
let server =  https.createServer(options, app);
server.listen( port );
let gun = Gun({ file: 'data', web: server });
global.gun = gun;  // <-- my gun instance on server side

global.gun.get('servertest').put('yes'); <-- I tried to put data 

// listening~~~~~ 
  1. 客户
    window.G = G;
    let opt = {};
    opt.store = RindexedDB(opt);
    opt.localStorage = false;
    opt.peers = ['https://my.link/gun'];

    G.gun = Gun(opt); // <-- my gun instance on client

    gun.get('servertest').once(console.log) // <-- it prints "undefined" even though I put data here by server!

我真的很想知道如何使用 gun 实例在服务器端.put()使用,.get()等方法。.on()

我尝试这样做但失败了,因为我将结果附在我的帖子上。

请让我知道我做错了什么以及正确的方法。谢谢

于 2020-02-26T11:44:09.463 回答