大家好,节日快乐!
我正在使用 socket.io 和 Express 创建一个聊天应用程序,需要一些有关如何继续的指导。
现在,我的 socket.io 模块与我的 Express js 文件位于同一文件中。
它工作正常,但是当我开始实现登录页面时,我注意到当转到“localhost:port/”时,我仍然连接到套接字,并且分配了一个 socket.id。
我认为,从顶部开始到底部确实有意义。
我的计划是:
首先浏览登录页面
然后重定向到“localhost:port/MessagingClient”并获取socket.id
现在如何运作:
进入登录页面,无需登录即可获取socket.id。
转到“localhost:port/MessagingClient”并分配一个新的socket.id
但是由于我在 1 个 js 文件中运行所有内容,因此它无法按我想要的方式工作。
我的问题是如何拆分“Login”页面和“MessagingClient”页面,但仍然在同一端口上运行?
我想我可以通过运行 2 个 Node js 进程而不是 1 个并使用 2 个端口来解决这个问题,但这是一种有效的方法吗?
MessaginServer.js:
const dotenv = require("dotenv").config();
const express = require("express");
const app = require("express")();
const http = require("http").Server(app);
const io = require("socket.io")(http);
const port = process.env.PORT || 3000;
// import { readFromDB } from "./mongoDB.js";
const { readFromDB } = require("./mongoDB");
app.use(express.static(__dirname + "/public/"));
app.get("/", (req, res) => {
res.sendFile(__dirname + "/Public/LoginClient.html");
});
app.get("/MessagingClient", (req, res) => {
res.sendFile(__dirname + "/Public/MessaginClient.html");
});
io.on("connection", async (socket) => {
// socket.on("test1", arr1, arr2)=>{};
// socket.on("test2", arr1, arr2)=>{};
})
http.listen(port, () => {
console.log(`Socket.IO server running at http://localhost:${port}/`);
});
我尝试过的:
我试图将所有socket.io代码移到里面
app.get("/MessagingClient", (req, res) => {
res.sendFile(__dirname + "/Public/MessaginClient.html");
});
但这导致消息重复..
然后我想到尝试使用 Npm concurrently ,但找不到任何关于是否可以在生产环境中使用它的信息。
有什么建议吗?
最佳答案
您在单独的文件中创建套接字服务器:
const socketServer = (server) => {
const io = require("socket.io")(server, {
cors: {
origin: "*",
methods: ["GET", "POST"],
},
});
//set middleware for socket server here before .on
io.use((socket, next) => {
yourMiddleware(socket, next);
});
// your io connection logic
io.on("connection", async (socket) => {
// socket.on("test1", arr1, arr2)=>{};
// socket.on("test2", arr1, arr2)=>{};
});
};
module.exports = {
socketServer,
};
然后在app.js中
//initialize app
const app = express();
// add your middlewares and routing
const server = http.createServer(app);
// import socketServer
socketServer(server);
server.listen(PORT, () => {
console.log(`Server is listening on ${PORT}`);
});
关于node.js - Socket.io 和 Express js 的分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74939435/