#node.js #reactjs #sockets #socket.io
Вопрос:
Привет, супер новичок в socket io и веб-сокетах в целом. У меня есть сценарий приложения для чата с socket io, в котором клиент отправляет данные на сервер, а сервер отправляет их обратно клиенту.
В моем случае излучение со стороны клиента улавливается на стороне сервера до сих пор без проблем.
Однако на стороне клиента есть некоторые сокеты.на выписках там, чтобы забрать вещи с сервера. Универсальная консоль.войдите в систему после срабатывания соединения, но в другом сокете.по заявлениям — нет.
Я подумал, что, возможно, излучение на стороне сервера не срабатывает. Где это становится странным, так это то, что когда я что-то меняю в файле на стороне клиента с помощью сокета.в операторах операторы на стороне клиента будут получать данные с сервера до следующего обновления страницы.
Также стоит отметить, что эти инструкции по работе с клиентами работают с информацией, собранной до сохранения: если что-то похоже
На стороне клиента:
socket.on("message", (data) => {
console.log(foo)
});
и я меняю его на
socket.on("message", (data) => {
console.log(bar)
});
а затем запустите цепочку отправлений,
socket.on(«сообщение… будет стрелять правильно, но он будет регистрировать «фу». Я предполагаю, что сохранение файла сокета на стороне клиента создает новое соединение или что-то в этом роде, но мне любопытно, почему только старое соединение получает данные с сервера, а не новое?
Мой код для справки:
(клиент)
const token = localStorage.getItem("messenger-token");
const socket = io.connect('http://localhost:3001', {
query: {token}
});
//const socket = io('http://localhost:3001');
socket.on("connect", () => {
console.log("connected to server");
socket.on("new-message", (data) => {
console.log(data.message)
store.dispatch(setNewMessage(data.message, data.sender));
});
socket.on("mark-as-read", (data) => {
store.dispatch(markedAsRead(data.convoToUpdate,'socket'));
});
});
(сервер)
//www
const server = http.createServer(app);
app.io.attach(server,{'pingInterval': 2000, 'pingTimeout': 50000});
//app
app.io = require('socket.io')();
require('./sockets')(app)
app.io.use(function(socket, next){
const token = socket.handshake.query.token
if (token) {
jwt.verify(token, process.env.SESSION_SECRET, (err, decoded) => {
if (err) {
return next(new Error('Authentication error'));
}
User.findOne({
where: { id: decoded.id },
}).then((user) => {
return next();
});
});
} else {
return next();
}
})
//sockets module
module.exports = (app) => {
app.io.on("connection", (socket) => {
console.log("connected")
socket.on("new-message", (data) => {
socket.broadcast.emit("new-message", {
message: data.message,
sender: data.sender,
});
socket.on("mark-as-read", (data) => {
socket.broadcast.emit("mark-as-read", {
convoToUpdate:data.convoId
});
});
});
Ответ №1:
Я не знаю, уместно ли это, но, оказывается, у меня не было проблем.
логика сервера:
socket.broadcast.emit("mark-as-read", {
convoToUpdate:data.convoId
});
});
использует broadcast.emit вместо обычного излучения. Это отправляет новую информацию всем, кроме отправителя, как показано в документах. ой