我正在将此服务器配置迁移到 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 参数,但没有成功。如果您有任何想法,他们将不胜感激。
干杯!