у меня есть приложение чата socket.io с комнатами, но без имен пользователей, все работает, кроме этого: до того, как я разместил свой сайт, я тестировал его в своем браузере, и я использовал метод document.hasFocus() для создания сообщений чата, таких как этот
, и мой код был таким
if (!document.hasFocus()) {
var mess = data.message;
var encod = $('<div />').text(mess).html();
output.innerHTML += '<div class = "hisout"><p class = "me">' + encod +
'</p></div>'
output.scrollTop = output.scrollHeight
и в противном случае класс div внутри моего выходного div был бы myout
это работало в моем браузере во время тестирования, а также работало во время производства, но не с двумя разными устройствами, это вызывало странные вещи, например, сообщения моего партнера отображались как мои (часто), так что кто-нибудь знает решение этой проблемы? вот мой код на стороне сервера
socket.on('chat', function(data) {
chnm.in(socket.current_room).emit('chat',data);
});
chnm — это пространство имен чата (io.of('/url'))
Спасибо
как document.hasFocus должен быть хорошим способом определить, принадлежит ли сообщение вам или вашим партнерам. Кажется, это было бы совершенно неважно.
да, я тестировал в своем браузере, и он работал таким образом, что ослепил меня и не понял, что это была самая большая ошибка
ты знаешь подсказку?
Я ожидаю, что данные сообщения должны будут включать идентификатор пользователя в той или иной форме.
как насчет socket.id/
Я бы ожидал data = { user: "user1Id", message: "foo" } и использовал реквизит пользователя для идентификации отправителя.
извините, но этот небольшой фрагмент немного неясен, можете ли вы показать мне действительно небольшой фрагмент SERVER&CLIENT в ответе, чтобы я мог отметить ваш ответ как правильный?





Вам нужен способ добавить свойство владельца к сообщениям, которые вы отправляете клиентам. Это должно исходить из сеанса, контролируемого сервером, чтобы клиенты не могли подделывать других клиентов и т. д. Таким образом, у вас будет некоторая форма входа в систему, которая создаст сеанс на стороне сервера, и затем вы будете использовать его для добавления идентификатора пользователя к сообщениям .
На самом деле примерно это может быть что-то вроде этого с использованием экспресс-сервера.
const expressSession = require("express-session");
const sharedsession = require("express-socket.io-session");
const io = require("socket.io").listen(server);
const session = expressSession();
// // Share session with io sockets and auto save on change
io.use(sharedsession(session), { autoSave: true });
io.on("connection", socket => {
const { session } = socket.handshake;
socket.on('chat', function(data) {
chnm.in(socket.current_room).emit('chat', { ...data, user: session.userId });
});
});
как насчет клиента, как я могу определить владельца сообщения на стороне клиента, это проблема для меня, на стороне сервера есть много альтернатив для этого
if (data.user === myId) {о, я понял, но в таком случае я тоже должен пройти Id
В самом деле? никто не знает?