Gun 0.8.8,Node.js-to-Node.js,Node.js-to-browser
以下是jsfiddle https://jsfiddle.net/sergibondarenko/tktodk62/20/
中的前端模拟要做一个干净的开始,我从Chrome本地存储中删除了本地data.json
和gun
数据。
在Node.js中创建一个节点
const gun = new Gun({peers:['http://localhost:8080/gun', 'http://localhost:8081/gun']});
const node = gun.get('watcher/f0de26c0-a29f-11e7-8661-154b982951a4');
node.on(function (v, k) {
console.log('v:', v);
console.log('k:', k);
});
在Node.js中收听
const node = gun.get('watcher/f0de26c0-a29f-11e7-8661-154b982951a4');
node.get('stats').on(function (v, k) {
console.log('v:', v);
console.log('k:', k);
});
按预期获得1个结果,好
v: { _: { '#': 'j948ewfltvmmHthoESzM', '>': { num: 1508766155692 } },
num: 0 }
k: stats
另外,我在浏览器端有一个监听器
<!DOCTYPE html>
<html>
<script src="http://rawgit.com/amark/gun/master/gun.js"></script>
<body>
<script>
var gun = new Gun({peers:['http://localhost:8080/gun', 'http://localhost:8081/gun']});
var node = gun.get('watcher/f0de26c0-a29f-11e7-8661-154b982951a4');
node.get('stats').on(function (v, k) {
console.log('v:', v);
console.log('k:', k);
});
</script>
</body>
</html>
在节点创建上得到1个结果,按预期好,
index.html:9 v: {"_":{"#":"j949102jDUdSklGduZh8",">":{"num":1508767186838}},"num":0}
index.html:10 k: stats
然后,我更新节点
const node = gun.get('watcher/f0de26c0-a29f-11e7-8661-154b982951a4');
node.put({
stats: {
num: 2
},
name: 'trex'
});
在两个侦听器上接收重复结果
Node.js的
v: { _: { '#': 'j949102jDUdSklGduZh8', '>': { num: 1508769723940 } },
num: 2 }
k: stats
v: { _: { '#': 'j949102jDUdSklGduZh8', '>': { num: 1508769723940 } },
num: 2 }
k: stats
浏览器
index.html:9 v: {"_":{"#":"j949102jDUdSklGduZh8",">":{"num":1508769723940}},"num":2}
index.html:10 k: stats
index.html:9 v: {"_":{"#":"j949102jDUdSklGduZh8",">":{"num":1508769723940}},"num":2}
index.html:10 k: stats
为什么我会收到重复项?
更新
即使只有一个枪支同伴,也有重复。
答案 0 :(得分:2)
如果我理解正确,(我不久前就自己提出了这个问题)那么它就是因为Gun认为它是在一个分散的格子网络中。获得更新的每个节点,重新广播更新到它知道的所有节点。即使Gun目前通过中继服务器集中,它也可以分散构建。因此,当您创建更改时,您将广播它,但是现在它只是通过中继服务器,它将广播给您包括您自己的每个节点。因此,如果您有三个对等网络,则中继服务器会将更新发送给所有三个(包括您)。您的对等方可以进行重复数据删除而不是重新广播更新,但其他节点将重新广播它,假设分散。因此,您将从服务器获得一个更新,然后从另一个节点获得另一个更新。
当我是唯一的同伴时,我还不太清楚为什么我会获得多次更新ping。我相信它与服务器有关,只是为了给系统添加一些冗余而不止一次地广播变化。