Просматривал документацию, но не повезло. Я пытаюсь отправить сообщение одному клиенту / пользователю, а не всем.
Я прочитал несколько других вопросов по этому поводу, на большинство из них нет ответа или они указывают на более старые решения. Любая помощь будет оценена.
Следующее работает, но излучает для всех на сайте, а не для отдельного пользователя ...
СЕРВЕР:
//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 на сервере. Наверное, чего-то очень простого я упускаю, просто не вижу.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я не думаю, что это предполагаемое использование 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().
Если вам действительно нужно излучать в один сокет, вам нужно больше поработать:
Вот пример использования пространства имен по умолчанию:
Сервер
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.'`);
});
Вот что я в итоге сделал для всех, кто пытался это понять.
СЕРВЕР:
//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}`);
}
Спасибо, что нашли время ответить, я буду использовать здесь некоторую полезную информацию. К сожалению, res.end () не работает в моем конкретном случае использования. Я нашел способ добиться того, к чему стремлюсь. Я отправлю его, чтобы другие тоже могли его найти.