Каков лучший дизайн Socket.IO для моего приложения? - PullRequest
0 голосов
/ 03 мая 2020

Понимание того, что это будет очень общий вопрос, но я попытаюсь быть максимально точным c:

Каков наилучший способ разработки / структурирования приложения Socket.IO ?

У меня есть NodeJS бэкэнд с интерфейсом React, с аутентификацией (пользователь должен войти в систему). У меня есть несколько конечных точек REST, например / foo, / bar, /baz.

Я знаю, что вы можете использовать комнаты и пространства имен, и я знаю, что вы можете добавить аутентификацию для соединения в качестве промежуточного программного обеспечения, но я понятия не имею, лучшее решение - склеить все это вместе. Я буду использовать этот сокет для нескольких целей. Для каждой цели мне любопытно, что лучший способ для go (поток).

  1. Общие сообщения CRUD: Когда кто-то публикует «foo» на стороне сервера, он должен также отправьте это конкретному пользователю. Когда кто-то удаляет «foo», ему также необходимо что-то отправить этому пользователю. Таким образом, этот обмен сообщениями CRUD должен быть только для одного указанного c пользователя (на основе зарегистрированного идентификатора пользователя). Как бы структурировать эти сообщения? Пространство имен для "foo"? Слушатели нескольких событий: в «foo create», «foo delete», «foo update?» Как убедиться, что вы отправляете только этому пользователю?

  2. У меня есть несколько страниц на стороне клиента для соответствующей конечной точки CRUD. Поэтому, когда я нахожусь на странице "foo", мне нужно получать обновления для объекта бэкэнда "foo". Как я могу выполнить sh это?

  3. Общие сообщения на стороне сервера: я буду запускать долгосрочные сценарии на стороне сервера, запускаемые пользователем (или с помощью триггера времени) , Если я go на этой странице реагирую и если существуют активные запущенные скрипты, которые принадлежат мне, мне нужно просмотреть эти журналы. (но опять же, они являются личными, поэтому эти сообщения предназначены только для меня).

Заранее спасибо, если вам нужно больше разъяснений, просто спросите меня, и я добавлю это к своему вопросу.

РЕДАКТИРОВАТЬ:
Я думаю, что CRUD-часть лучше создать как «слушателя обновлений» (например, firebase onSnapshot). Поэтому на странице foo я буду слушать обновления в базе данных foo, но обновления или создания не выполняются через обычный REST API. Это действительно лучший способ?

1 Ответ

0 голосов
/ 04 мая 2020

Вы можете аутентифицировать соединение socket.io в событии 'connection' или с помощью промежуточного программного обеспечения - do c.

Также вы можете использовать какой-то пакет из npm, например this

После аутентификации сохраните пользовательские данные в объекте сокета или в виде отдельного объекта в области действия 'connection' .

io.on('connection', (socket) => {   
   const handshake = socket.handshake;

   const user = // fetch user obj according data in handshake, for example, from jwt token in header
});

Таким образом, после того, как вы сможете использовать объект пользователя в других событиях для этого соединения.

Личные сообщения в соответствии с вашей задачей, которую я реализовал в своем проекте с использованием комнат. Вот абстрактный пример:

// this is just a helper to get room name according to userId
getUserRoomName(userId) {
    return `user_${userId}`;
}

// function to send data to user
sendToUser(userId, event, data) {
    io.to(getUserRoomName(userId)).emit(event, data);
}

// in 'connection' event add join to user room
io.on('connection', (socket) => {   
   const handshake = socket.handshake;

   const user = // fetch user obj according data in handshake, for example, from jwt token in header

   // join to private room
   socket.join(getUserRoomName(user.userId), () => {
       // some logic
   });
});

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

Используя метод sendToUser, вы можете отправлять любые типы данных всем пользовательским соединениям из любой части вашего приложения:

sendToUser(userId, 'foo_create', data);

OR

sendToUser(userId, 'foo', {
    action: 'create',
    // some other data
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...