【问题标题】:How to organize socket-io files in an express server?如何在快速服务器中组织 socket-io 文件?
【发布时间】:2021-06-08 05:17:15
【问题描述】:

我最近开始在我的一个项目中使用 socket-io 实现实时聊天功能。我的一切工作正常,但到目前为止,我在主“index.js”文件中拥有所有服务器端 socket-io 的东西(连接、中间件、事件处理程序等)。现在这没什么大不了的,因为我只听了几个事件,但我想在代码失控之前将代码组织和分离成更小的文件。

下面是我的 index.js 文件中代码的 socket-io 部分的示例:

const express = require("express");
const app = express();
const http = require("http");
const server = http.createServer(app);
const { Server } = require("socket.io");
const io = new Server(server);
const jwt = require("jsonwebtoken");

const activeSockets = {};

io.use((socket, next) => {
  const { token } = socket.handshake.auth;
  if (!token) return next(new Error("Invalid or missing token"));
  const { _id } = jwt.verify(token, process.env.JWT_KEY);
  socket.handshake.auth._id = _id;
  next();
});

const addSocket = (socket) => {
  const { _id } = socket.handshake.auth;
  if (!activeSockets[_id]) activeSockets[_id] = [socket.id];
  else activeSockets[_id] = [...activeSockets[_id], socket.id];
};

const removeSocket = (socket) => {
  const { _id } = socket.handshake.auth;
  if (!_id || !activeSockets[_id]) return;
  const index = activeSockets[_id].indexOf(socket.id);
  activeSockets[_id].splice(index, 1);
  if (activeSockets[_id].length < 1) delete activeSockets[_id];
};

io.on("connection", (socket) => {
  addSocket(socket);
  socket.on("typing", (isTyping, recipients, conversation, sender) => {
    recipients.forEach((recipient) => {
      if (activeSockets[recipient._id]) {
        activeSockets[recipient._id].forEach((r) => {
          socket.to(r).emit("typing", isTyping, conversation, sender);
        });
      }
    });
  });
  socket.on("sendMessage", ({ message, recipients, conversation }) => {
    recipients.forEach((recipient) => {
      if (activeSockets[recipient._id]) {
        activeSockets[recipient._id].forEach((r) => {
          socket.to(r).emit("receiveMessage", { message, conversation });
        });
      }
    });
  });
  socket.on("disconnect", () => {
    removeSocket(socket);
  });
});


const port = process.env.PORT || 5000;
server.listen(port, () => {
  console.log("Listening: ", port);
});

我只是在努力寻找一种有效的方法来将 socket-io 代码提取成更小更有组织的部分。 index.js 中与 socket-io 相关的唯一内容应该是连接本身吗?然后我有不同的事件处理程序的文件,它们带有一个“io”参数,然后我在这些外部函数中调用“io.on(...)”?或者也许我应该监听 index.js 中的所有事件,然后只将每个事件的逻辑提取到单独的文件中?比如:

io.on("eventName", someExternalFunction)

这是我第一次使用 socket-io,所以我不太确定“最佳实践”。

感谢任何可以提供帮助的人!

【问题讨论】:

    标签: node.js express socket.io


    【解决方案1】:

    您可以将套接字事件处理程序放入模块中。

    聊天/connection.js:

    module.exports = (io) => {
      io.on("connection", (socket) => {
        console.log('connection was made');
      });
    }
    

    然后在 index.js 中require('./chat/connection.js')(io);

    【讨论】:

    • 那么你会在connections.js中监听所有与聊天相关的事件吗?例如:io.on("connection", (socket) =&gt; {socket.on("messageEvent", messageEventHandler)})
    猜你喜欢
    • 2012-12-16
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 2019-07-07
    相关资源
    最近更新 更多