ввод-вывод сокета на стороне клиента выполняется только после сохранения файла, содержащего соединение

#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 вместо обычного излучения. Это отправляет новую информацию всем, кроме отправителя, как показано в документах. ой