Estoy tratando de utilizar ws (socket web) en mi aplicación Nextjs.
En lugar de crear un nuevo servidor, quiero pasar el objeto del servidor actual a la inicialización de ws:
const { Server } = require('ws'); wss = new Server({ myNextJs server instance here ... });Entonces: ¿cómo obtener una referencia al servidor Nextjs en tiempo de ejecución?
Puede crear un servidor personalizado. Consulte https://nextjs.org/docs/advanced-features/custom-server
Aquí hay un ejemplo:
const express = require("express"); const next = require("next"); const dev = process.env.NODE_ENV !== "production"; const app = next({ dev }); const handle = app.getRequestHandler(); const server = express(); app.prepare().then(() => { server.get("/some-random-path", (req, res) => res.send("Hello, world!")); server.get("*", (req, res) => handle(req, res)); server.listen(3000, "0.0.0.0", () => { console.log("Application started on http://localhost:3000"); }); });Luego simplemente ejecute su nuevo archivo de servidor
puede fusionar el código de mi respuesta sobre socket.io
https://stackoverflow.com/a/62547135/2068876
con el ejemplo dado en Github:
https://github.com/websockets/ws#multiple-servers-sharing-a-single-https-server
intente algo como esto (no probado, pero parece válido ya que el principio es el mismo):
./pages/api/wss1.js
import { WebSocketServer } from "ws"; const wss1Handler = (req, res) => { if (!res.socket.server.wss1) { console.log("*First use, starting wss1"); const wss1 = new WebSocketServer({ noServer: true }); res.socket.server.on("upgrade", function upgrade(request, socket, head) { wss1.handleUpgrade(request, socket, head, function done(ws) { wss1.emit('connection', ws, request); }); }); res.socket.server.wss1 = wss1; } else { console.log("wss1 already running"); } res.end(); } export const config = { api: { bodyParser: false } } export default wss1Handler;