【发布时间】: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,所以我不太确定“最佳实践”。
感谢任何可以提供帮助的人!
【问题讨论】: