Событие Emit для конкретного пользователя в Socket.io в узле js - PullRequest
0 голосов
/ 13 января 2019

Я использовал метод socket.on и io.emit для запроса и ответа соответственно. В настоящее время у меня возникла проблема, что я получил ответ всем пользователям. Я хочу просто уведомить конкретного пользователя . Но когда я задал вышеуказанный вопрос о stackoverflow, кто-то попросил меня перейти по этой ссылке. Но в приведенной выше ссылке упоминается, что нам нужен идентификатор пользователя, который я могу получить при входе пользователя в наше приложение . Пожалуйста, взгляните на мой server.js и router.js код файла.

router.js

const express = require('express');
const router = express.Router();
const passport = require('passport');

const userController = require('../controllers/user');

router.route('/auth/login')
  .post(
    userController.login
  );

router.route('/users')
  .get(
    passport.authenticate('jwt', { session: false }),
    userController.getUsers
  );

module.exports = router;

server.js

const express = require('express');
const router = require('./router');
const bodyParser = require('body-parser');

const app = express();
app.use(bodyParser.json());

var server = require('http').Server(app);
var io = require('socket.io')(server);    
server.listen(PORT, () => {
  console.log(`?\tListening on port ${PORT}!`);
});
app.io = io;
app.use('/api', router);

Примечание: Может кто-нибудь сказать, пожалуйста, сейчас, как создать событие для конкретного пользователя, если у меня есть регистрация и вход в мое приложение.

Ответы [ 2 ]

0 голосов
/ 14 января 2019
[https://socket.io/docs/emit-cheatsheet/][1]

io.on ('connect', onConnect);

функция onConnect (сокет) {

// отправка клиенту socket.emit ('привет', 'ты меня слышишь?', 1, 2, 'abc');

// отправка всем клиентам, кроме отправителя socket.broadcast.emit ('broadcast', 'hello friends!');

// отправка всем клиентам в игровой комнате, кроме отправителя socket.to ('game'). emit ('хорошая игра', "давай поиграем в игру");

// отправка всем клиентам в комнате 'game1' и / или в комнате 'game2', кроме отправителя socket.to ('game1'). to ('game2'). emit ('nice game', "Давайте играть в игру (тоже)");

// отправка всем клиентам в игровой комнате, включая отправителя io.in («игра»). emit («большое объявление», «игра скоро начнется»);

// отправка всем клиентам в пространстве имен «myNamespace», включая отправителя io.of ('myNamespace'). emit ('больший анонс', 'турнир скоро начнется');

// отправка в определенную комнату в определенном пространстве имен, включая отправителя io.of ('myNamespace'). to ('room'). emit ('event', 'message');

// отправка отдельному сокету (личное сообщение) io.to (${socketId}). emit («эй», «я только что встретил тебя»);

// ПРЕДУПРЕЖДЕНИЕ: socket.to(socket.id).emit() НЕ будет работать, так как будет отправлено всем в комнате // имя socket.id но отправитель. Пожалуйста, используйте классический socket.emit() вместо.

// отправка с подтверждением socket.emit ('вопрос', 'вы так думаете?', функция (ответ) {});

// отправка без сжатия socket.compress (false) .emit («несжатый», «грубый»);

// отправка сообщения, которое может быть отброшено, если клиент не готов к приему сообщений socket.volatile.emit ('возможно', 'вам это действительно нужно?');

// указание, имеют ли данные для отправки двоичные данные socket.binary (false) .emit («что», «у меня нет двоичных файлов!»);

// отправка всем клиентам на этом узле (при использовании нескольких узлов) io.local.emit («привет», «мои милые дети»);

// отправка всем подключенным клиентам io.emit ('событие отправлено всем подключенным клиентам');

* +1039 *};

Это сокет io emit-cheatsheet. Один из способов - создать ROOM по уникальному идентификатору пользователя и присоединиться к нему. поэтому всякий раз, когда вы отправляете что-то в эту КОМНАТУ, этот конкретный пользователь получит это сообщение. Создание ROOM проще, поэтому позже вы можете просто проверить, что ROOM для пользователя онлайн, офлайн и другой работы. Эта концепция может работать для одного пользователя и нескольких групп пользователей, таких как watsapp.

0 голосов
/ 14 января 2019

Попробуйте что-то вроде этого

let sockets = [];

    io.on("connection", function(socket) {
      socket.on("online", data => {
        socket.name = data.username;
        sockets[data.username] = socket.id;
      });
      socket.on("message", function(data) {
        socket.broadcast.emit("public", data);
      });

      socket.on("send_personal_message", function(data) {
        socket.to(sockets[data.user]).emit("personal", data);
      });

      socket.on("disconnect", reason => {
        sockets.splice(sockets.findIndex(id => id === socket.id), 1);
      });
    });

в send_personal_message вы получите имя пользователя от отправителя внутри объекта данных. Следующий код поможет вам отправить сообщение выбранному пользователю.

socket.to(sockets[data.user]).emit("personal", data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...