Как написать пользовательское промежуточное программное обеспечение и передать в конвейер пользовательских событий socket-io?

#node.js #socket.io

#node.js #socket.io

Вопрос:

Я использую socket-io для создания приложения для чата. И у меня много пользовательских событий, и для каждого события я хочу передать другую функцию промежуточного программного обеспечения? В моем случае io.use(somefunction()) не работает! Я хочу передать функцию промежуточного программного обеспечения своему пользовательскому событию вот так? io.on('my-custom-event', middleware, function() { ... })

Код маршрута Socket-io: (Путь: /routes/user.js )

 module.exports.user_status_info = function (io,socket) {
    socket.on('custom-event', io.use(require('../../middleware/_chat-validation-middlewares/custom-event').validate(io,socket)), function (data, callback) { ... }
}
 

Промежуточное программное обеспечение: (Путь: /middleware/custom-event.js )

 module.exports.validate = function (io,socket) {
    io.use((socket, next) => {
        console.log("I AM A MIDDLEWARE...")
        next();
    }); }
 

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

Ответ №1:

вы можете использовать что-то вроде обратите внимание, что вам не нужно использовать свои данные для объекта сокета и использовать их только для вашего конкретного события

сервер:

   io.use(async (socket, next) => {
try {
  const token = socket.handshake.query.token;
  const payload = await jwt.verify(token, process.env.SECRET_KEY);
  socket.userId = payload.id;
  socket.name = payload.username;
  console.log({ socketisd: socket.userId, name: socket.name });
  next();
} catch (err) { }
});
 

а затем просто используйте объект Socket позже, чтобы получить все необходимые данные

клиент:

       const [socket, setSocket] = React.useState(null);

  const setupSocket = () => {

    const token = sessionStorage.getItem("yourjwtToken");
    if (token amp;amp; !socket) {
      const newSocket = io("/", {
        query: {
          token,
        },
        path: '/socket'//if you have one
      });

      newSocket.on("disconnect", () => {
        console.log("Socket disconnect");
      });

      newSocket.on("connect", () => {
        console.log("Socket Connected");
      });

      setSocket(newSocket);
    }
  };

  React.useEffect(() => {
    if (currentUser amp;amp; !socket) setupSocket();
    //eslint-disable-next-line
  }, [socket]);