Как игнорировать событие websocket для клиента, который внес изменения через HTTP? - PullRequest
1 голос
/ 19 сентября 2019

У нас есть приложение React, которое использует REST для получения и обновления данных и Websocket для получения уведомлений об изменениях.

Представляя, что у нас есть коллекции / пользователи

  1. user1 вызывает httpметод POST / users для создания нового пользователя
  2. user1 получает положительный HTTP-ответ, и созданный пользователь добавляется в список пользовательского интерфейса.
  3. user1 также получает уведомление Websocket «user: создал» и снова пытаетсядобавить новый элемент в список пользовательского интерфейса.

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

Несколько возможных решений: 1. Пропустить событие WS для пользователя, который вызвал POST / users.В проблеме у него могло быть несколько открытых вкладок браузера.И все они не будут обновлены.2. Не обрабатывать ответы HTTP, обрабатывать только события WS.

Кто-нибудь сталкивался с такой проблемой?Какие еще решения доступны?

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Вы в основном указали лучшее решение (2.), но вот несколько вариантов

  1. Не используйте ответ от POST, а скорее ждите события "user: made", которое будет обновленосписок для всех подписанных клиентов (включая одного, который инициировал POST) - предлагаемый подход
  2. Используйте вашу текущую реализацию, но ваши POST и событие "user: made" должны иметь некоторый идентификатор, который они возвращаютнаряду с остальной частью запроса, который клиент может использовать, чтобы определить, получил ли он уже эту информацию или нет - например, «user: creation: {userId}».Тогда только клиент, у которого нет «user: creation: {userId}» в памяти, будет использовать данные событий WS.- не рекомендуется
  3. Пропускать событие WS для пользователя, инициировавшего POST - проблема в том, что к конкретному пользователю подключено несколько клиентов (вкладки, браузер + мобильный и т. д.) - при таком подходе вам придется пропустить WSсобытие для клиента (connectionId в терминах сокета), инициировавшего запрос POST (не пользователь!).Таким образом, если у пользователя есть 10 подключений, вы отправляете событие «пользователь: созданный» на 9 подключений, кроме того, которое инициировало запрос + все другие подключения, которые должны получить это событие, - не рекомендуется, поскольку это сильно усложняет ваш бэкэнд.

На мой взгляд, самый простой и чистый способ - просто игнорировать POST-ответ и ждать этого события WS - поскольку это сокеты, у вас не должно быть никаких проблем или задержек пользовательского интерфейса.

0 голосов
/ 25 сентября 2019

Если клиент, добавивший пользователя, отправляет событие, используйте

// sending to all clients except sender
  socket.broadcast.emit('broadcast', 'hello friends!');

. Это не будет отправлять событие клиенту, и вы можете иметь логику в приложении реакции для прослушивания события сокета.а также ответ на запрос http.Это предотвратит дублирование или неверные данные.

Если для одного клиента открыто несколько вкладок, вкладка клиента, инициировавшая запрос http, обновит список состояний ответом http и всеми вкладками других пользователей или другими.пользователи получат событие сокета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...