node.js - Socket.io 和 Express js 的分离

标签 node.js express socket.io

大家好,节日快乐!

我正在使用 socket.io 和 Express 创建一个聊天应用程序,需要一些有关如何继续的指导。
现在,我的 socket.io 模块与我的 Express js 文件位于同一文件中。

它工作正常,但是当我开始实现登录页面时,我注意到当转到“localhost:port/”时,我仍然连接到套接字,并且分配了一个 socket.id。
我认为,从顶部开始到底部确实有意义。

我的计划是:

  1. 首先浏览登录页面

  2. 然后重定向到“localhost:port/MessagingClient”并获取socket.id

现在如何运作:

  1. 进入登录页面,无需登录即可获取socket.id。

  2. 转到“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/

相关文章:

javascript - NodeJS - 本地范围已关闭( fatal error )

javascript - RabbitMQ:前一项完成后消费项目

node.js - 如何设置偏执 : false for all queries in sequelize?

jquery - 模糊整个 <li> 除了最后一个词

javascript - react.js - 服务器端渲染和路由策略

javascript - 我可以在 Node.js 和 Express 中运行单个 .js 文件吗?

javascript - 当实际页面由 localhost 服务器提供时,如何使用 socket.io 与另一台服务器通信?

javascript - 跟踪聊天系统中的消息

node.js - 如何生成 key 对并使用它来签名和验证 Node.js 中的文本?

node.js - 如何使用 Electron 构建桌面应用程序