我认为服务器中的 gun 实例也是同行之一。但是当我把数据放到服务器上的时候,对端是拿不到数据的。
这是我的简单测试代码。
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()
因为数据进入时可能会触发多次。
相关链接:
编辑:为了更明确地说明我上面的旁注——您的客户端获取非本地数据once
的回调实际上是设计使然。这意味着客户端还没有可用的请求数据。然而,它会从它的对等点请求它,它会尝试用他们自己可以解决的问题(本地或从他们各自的对等点)来回答。这些答案将再次触发回调(如果他们通过了我认为的 CRDT 算法)。undefined
登陆undefined
客户端也可能意味着服务器的响应可能已经超时,而 GUN 认为它没有得到响应。您可以使用 延长等待时间.once(callback_function, {wait: time_in_miliseconds})
。
根据 Hadar 的回答,尝试使用on()
而不是once()
缓解竞争条件,即您的客户端在您实际编写数据之前从服务器请求数据。一旦你得到你的数据并且不想要任何更新,你可以取消订阅gun.get('servertest').off()
此外,值得注意的是GUN 实例并没有神奇地链接;将它们中的两个连接起来并不意味着它们在任何方面都是相同的。从概念上讲,它们是分布式系统中的对等点,在 GUN 的情况下,这为您提供了与所有限制和权衡相关的最终一致性。
尝试gun.on
而不是once
. on 将订阅所有更改。如果您.once
仅在向服务器写入内容后运行,您的示例应该可以工作。在客户端上使用gun.on
应该无论如何都可以工作,并且会在服务器写一些东西的那一刻触发
@skiqh
您好,感谢您的回答。我在服务器和客户端都很好地启动了枪实例。
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~~~~~
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()
我尝试这样做但失败了,因为我将结果附在我的帖子上。
请让我知道我做错了什么以及正确的方法。谢谢