我认为服务器中的枪实例也是对等体之一。 但是当我将数据放到服务器上时,对等方无法获取数据。
这是我的简单测试代码。
global.gun.get('servertest').put('yes'); // at server side
gun.get('servertest').once(console.log); // at client side
它打印 undefined 。 请让我知道如何在服务器端使用枪支实例。
最佳答案
在服务器上,运行此命令以实际接受远程连接:
var server = require('http').createServer().listen(8080);
var gun = Gun({web: server});
在客户端上,运行此命令以连接到您的服务器:
var gun = Gun({peers: ["http://server-ip-or-hostname:8080/gun"]})
顺便说一句,即使您建立对等连接来获取数据,您仍然需要处理 undefined
,因为 once()
可能会触发多次数据正在传入。
相关链接:
- https://gun.eco/docs/Installation#server :
- https://github.com/amark/gun/tree/master/examples
- https://github.com/skiqh/gun-cli
编辑:
为了更明确地说明我上面的旁注——客户端上的 once
回调为非本地数据获取 undefine
实际上是设计使然的。这意味着客户端尚未获得所请求的数据。然而,它会向其对等方请求它,而对等方将尝试回答他们自己可以解决的问题(本地或来自各自的对等方)。这些答案将再次触发回调(我认为如果它们通过了 CRDT 算法)。
在客户端上获取未定义
也可能意味着服务器的响应可能已超时,并且 GUN 认为它未得到应答。您可以使用 .once(callback_function, {wait: time_in_miliseconds})
来延长等待时间。
根据 Hadar 的回答,尝试使用 on()
而不是 once()
来缓解竞争条件,即您的客户端请求数据在你实际编写之前的服务器。获取数据并且不想再更新时,您可以使用 gun.get('servertest').off()
此外,值得注意的是,GUN 实例并非神奇链接;其中两个连接并不意味着它们在任何方面都是一个且相同的。从概念上讲,它们是分布式系统中的对等体,在 GUN 的例子中,这使您能够最终与与之相关的所有限制和权衡保持一致。
关于gun - 如何将数据作为对等方放入服务器端的gundb中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60408502/