Как я могу передать одному клиенту с socket.io (а не всем)

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

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

Следующее работает, но излучает для всех на сайте, а не для отдельного пользователя ...

СЕРВЕР:

//Socket.io
const http = require('http').Server(app);
const io = require('socket.io')(http);

app.post('/login', (req, res) => {
    const email = cryptonize.encrypt(req.body.email);
    const password = cryptonize.encrypt(req.body.password);
    io.emit('login success', email, password);
});

КЛИЕНТ:

const socket = io();
socket.on('login success', (user, token, auth) => {
    console.info(`user:${user}, password:${password});
});

Я пробовал "socket.emit", как упоминалось в шпаргалке по socket.io, но он возвращается как undefined на сервере. Наверное, чего-то очень простого я упускаю, просто не вижу.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
187
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я не думаю, что это предполагаемое использование socket.io.

В вашем случае подойдет простой res.end(...) (по крайней мере, исходя из того, что вы нам показали).

app.post('/login', (req, res) => {
    const email = cryptonize.encrypt(req.body.email);
    const password = cryptonize.encrypt(req.body.password);
    res.end(/* data */);
});

Прочтите документы о res.end().

Если вам действительно нужно излучать в один сокет, вам нужно больше поработать:

  1. Используйте комнаты или пространство имен socket.io.
  2. Получите идентификатор целевого сокета.
  3. Выпустить с использованием идентификатора сокета.

Вот пример использования пространства имен по умолчанию:

Сервер

const IO = require('socket.io');
const io = IO(server);

// Default namespace is '/'
const namespacedIO = io.of('/');

io.on('connection', socket => {
    socket.on('send', data => {
        const targetSocket = namespacedIO.connected[data.socketID];
        targetSocket.emit('received', data.value);
    });
});

Клиент

const socket = io();

submit.addEventListener('click', function(){
    socket.emit('send', {
        socketID: socket.id,  // IMPORTANT: to get the source socket ID
        value: input.value
    });
})

socket.on('received', function(data){
    console.info(`Data "${data}" is received at server.'`);
});

Спасибо, что нашли время ответить, я буду использовать здесь некоторую полезную информацию. К сожалению, res.end () не работает в моем конкретном случае использования. Я нашел способ добиться того, к чему стремлюсь. Я отправлю его, чтобы другие тоже могли его найти.

iPzard 02.01.2019 03:09
Ответ принят как подходящий

Вот что я в итоге сделал для всех, кто пытался это понять.

СЕРВЕР:

//Socket.io
const http = require('http').Server(app);
const io = require('socket.io')(http);

app.post('/login', (req, res) => {
    const email = cryptonize.encrypt(req.body.email);
    const password = cryptonize.encrypt(req.body.password);
    const socketid = req.query.socket;

    io.sockets.connected[socketid].emit('login success', email, password);
});

КЛИЕНТ:

const socket = io();
let socketid;
socket.on('connect', () =>  socketid = socket.io.engine.id);

КОНТАКТ КЛИЕНТА
Затем я просто добавил запрос socketid к своим сообщениям по мере их создания.

//XHR Setup
const xhr = new XMLHttpRequest();
let response, status, readyState;
xhr.onreadystatechange = () => {
    if (xhr.status === 200 && xhr.readyState === 4) response = xhr.response;
};

//XHR POST
const post = ({ url, callback, data }) => {
    xhr.open('POST', `${url}&socketid=${socketid}`, true), xhr.setRequestHeader('Content-type', 'application/json'), xhr.send(data);
    if (callback) callback();     
    console.info(`${url}&socketid=${socketid}`);   
}

Другие вопросы по теме