0

我正在将此服务器配置迁移到 Socket.io 设置,您可以在其中看到将 uWebSockets.js 用于幕后的 http 服务器。注释行是以前的状态(完美运行):

// import express, { Express, Request, Response } from "express";
// import * as http from "http";
import * as uWebSockets from "uWebSockets.js";
import expressify from "uwebsockets-express";
import next, { NextApiHandler } from "next";
import * as socketio from "socket.io";
import SocketManager from "./SocketManager";

import allowCors from "../pages/api/cors";
import dotenv from "dotenv";

dotenv.config();
const port: number = parseInt(process.env.SERVER_PORT || "5000", 10);
const dev: boolean = process.env.NODE_ENV !== "production";
export const nextApp = next({ dev });
const nextHandler: NextApiHandler = nextApp.getRequestHandler();

nextApp.prepare().then(async () => {
  // const app: AppOptions = express();
  const app: uWebSockets.TemplatedApp = uWebSockets.App();
  const myapp = expressify(app);
  // const server: http.Server = http.createServer(app);
  const io: socketio.Server = new socketio.Server({
    cors: {
      origin: "*",
      methods: ["GET", "POST"]
    }
  });


// io.attach(server);
  io.attachApp(app);

  myapp.get("/", async (_, res) => {
    res.send("Running");
  });

  myapp.use("../pages/api/cors", allowCors);
  io.on("connection", SocketManager);

  myapp.all("*", (req: any, res: any) => nextHandler(req, res));

  myapp.listen(port, () => {
    console.log(
      `> Server listening at http://localhost:${port} as ${
        dev ? "development" : process.env.NODE_ENV
      }`
    );
  });
});

这是一个 SocketManager.ts 文件,其中包含套接字所承担的所有进程:

import * as socketio from "socket.io";

const io: socketio.Server = new socketio.Server({
  cors: {
    origin: "*",
    methods: ["GET", "POST"]
  }
});

export default function SockerManager(socket: socketio.Socket) {
  try {
    socket.emit("me", socket.id);

    socket.on("disconnect", () => {
      socket.broadcast.emit("callEnded");
    });

    socket.on("callUser", ({ userToCall, signalData, from, name }) => {
      io.to(userToCall).emit("callUser", { signal: signalData, from, name });
    });

    socket.on("answerCall", (data) => {
      io.to(data.to).emit("callAccepted", data.signal);
    });
  } catch (ex) {
    console.log(ex);
  }
}

这是 CORS 中间件:

import Cors from "cors";
import initMiddleware from "../../lib/init-middleware";
import { Request, Response } from "express";

// Initializing the cors middleware
const cors = initMiddleware(
  Cors({
    origin: "*",
    methods: ["GET", "POST", "OPTIONS"],
  })
);

export default async function allowCors(req: Request, res: Response) {
  // Run cors
  await cors(req, res);

  // Rest of the API logic
  res.json({ message: "Cors responding here!" });
}

我想不出有什么遗漏。我一直在尝试为 uWebSockets 方法替换 CORS 文档上的 express 参数,但没有成功。如果您有任何想法,他们将不胜感激。

干杯!

4

0 回答 0