Как поместить данные в gundb на стороне сервера в качестве пира - PullRequest
0 голосов
/ 26 февраля 2020

Я думал, что экземпляр пистолета на сервере также был одним из пиров. Но когда я помещаю данные на сервер, узел не может получить данные.

Вот мой простой тестовый код.

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

И он печатает undefined . пожалуйста, дайте мне знать, как использовать пистолет на стороне сервера.

Ответы [ 3 ]

0 голосов
/ 26 февраля 2020

попробуйте gun.on вместо once. подписаться на все изменения. Ваш пример должен работать, если вы запускаете .once только после того, как что-то записали на сервер. использование gun.on на клиенте должно работать независимо и запускать момент, когда сервер пишет что-то

0 голосов
/ 26 февраля 2020

@ 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~~~~~ 
client
    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!

Я действительно хочу знать, как использовать такие методы, как .put(), .get(), .on() et c .. на стороне сервера с использованием экземпляра пистолета.

Я пытался сделать это, но потерпел неудачу, прикрепив результат к своему сообщению.

Пожалуйста, дайте мне знать, что я делаю что-то не так и правильным способом. Спасибо

0 голосов
/ 26 февраля 2020

На сервере запустите это, чтобы фактически принимать удаленные соединения:

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

На клиенте запустите это для подключения к вашему серверу:

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

В качестве примечания, даже если вы устанавливаете sh одноранговое соединение для получения ваших данных, вам все равно нужно обрабатывать undefined, поскольку once() может срабатывать несколько раз при поступлении данных.

Соответствующие ссылки:


РЕДАКТИРОВАТЬ: Чтобы быть более точным в отношении моего примечания выше - обратный вызов once на вашем клиенте получение undefined для нелокальных данных фактически задуман . Это означает, что у клиента еще нет запрошенных данных. Однако он будет запрашивать его у своих коллег, которые попытаются ответить тем, что они сами могут решить (локально или у своих соответствующих коллег). Эти ответы снова вызовут обратный вызов (я думаю, что если они прошли через алгоритм CRDT).

Получение undefined на клиенте также может означать ответ сервера мог истечь , и GUN посчитал его без ответа. Вы можете продлить время ожидания с помощью .once(callback_function, {wait: time_in_miliseconds}).

. Согласно ответу Хадара, попробуйте использовать on() вместо once(), чтобы смягчить условия гонки , т.е. ваш клиент запрашивает данные у сервер, прежде чем вы на самом деле написали это. Как только вы получили свои данные и не хотите больше обновлений, вы можете отказаться от подписки с помощью gun.get('servertest').off()

Кроме того, следует отметить, что экземпляры GUN не связаны магическим образом ; соединение двух из них не означает, что они одинаковы в любом случае. Концептуально они являются партнерами в распределенной системе, что в случае GUN дает вам возможную согласованность со всеми ограничениями и компромиссами, связанными с этим.

...