Anonymous
Не удалось переподключить сокет node.js
Сообщение
Anonymous » 15 дек 2025, 09:28
Я новичок в Socket.io;
соединение успешное, «излучает» сигналы тревоги и «включено» успешно прослушивается с обеих сторон. но когда я перезагружаю свой интерфейс, соединение теряется; я неоднократно находил в консоли интерфейса это-
Код: Выделить всё
code: 'WS_ERR_EXPECTED_FIN',
[Symbol(status-code)]: 1002
},
[Symbol(kMessage)]: 'Invalid WebSocket frame: FIN must be set'
},
контекст: неопределенный,
тип: 'TransportError'
если перезапустить мой внутренний сервер node.js, то снова будет установлено соединение (новое). я думаю, что это проблема моего внутреннего сервера, что я могу сделать?
мой внутренний index.js-
Код: Выделить всё
const http = require("http");
const { initializeSocket } = require("./config/socket");
init();
async function init() {
try {
db = await mongoose();
console.log("MongoDB Connected!");
} catch (err) {
logger.verbose("[index/init]" + err);
console.log(33, err);
}
global.settings = await Settings.findOne();
...
initializeSocket(httpServer);
httpServer.listen(process.env.PORT, () => {
console.log(`Server running on ${process.env.APP_URL}${process.env.PORT}`);
});
}
и мой серверный файл config/socket.js
Код: Выделить всё
const socketIO = require("socket.io");
const { createAdapter } = require("@socket.io/redis-adapter");
let io = null;
const initializeSocket = (httpServer) => {
const allowedOrigins = [
"http://localhost:3000",
"http://localhost:3002",
"http://localhost:4005",
"null", //for native apps (Android/iOS)
];
io = socketIO(httpServer, {
transports: ["polling", "websocket"],
allowUpgrades: true,
pingTimeout: 20000,
pingInterval: 25000,
cors: {
origin: (origin, callback) => {
console.log("origin", origin);
console.log(
!origin || origin === "null" || allowedOrigins.includes(origin)
);
if (!origin || origin === "null" || allowedOrigins.includes(origin)) {
callback(null, true);
} else {
callback(new Error("Not allowed by CORS"));
}
},
methods: ["GET", "POST", "OPTIONS"],
credentials: true,
},
perMessageDeflate: true,
});
// Attach Redis adapter
// io.adapter(createAdapter(pubClient, subClient));
io.engine.on("connection_error", (err) => {
console.log("ENGINE CONNECTION ERROR");
logger.error("ENGINE CONNECTION ERROR", err);
console.log(err);
});
io.on("connection", function (socket) {
const origin = socket.handshake.headers.origin;
console.log(`[socket] Client connected: ${socket.id} from ${origin}`);
socket.conn.on("upgrade", () => {
console.log("UPGRADED TO", socket.conn.transport.name);
});
// Operator connects
socket.on("operatorConnected", (operatorId) => {
const roomName = `operator_${operatorId}`;
socket.join(roomName);
console.log(`Operator ${operatorId} connected: ${socket.id}`);
socket.on("disconnect", () => {
socket.leave(roomName);
console.log(`Socket ${socket.id} left room ${roomName}`);
});
});
socket.on("disconnect", () => {
console.log(`[socket] ${socket.id} disconnected`);
});
});
console.log("Socket running on same Server !");
};
module.exports = {
initializeSocket,
getIO: () => io,}
а это мои хуки next.js для интерфейса —
Код: Выделить всё
import { useEffect, useContext } from "react";
import { socket } from "../../utils/socket";
import { AppContext } from "../context/AppContext";
export default function useOperatorSocket() {
const { authUser, setOperatorDrivers } = useContext(AppContext);
// CONNECT
useEffect(() => {
if (!socket.connected) {
socket.connect();
}
return () => {};
}, []);
и мой next.js utils/socket.js
Код: Выделить всё
import { io } from "socket.io-client";
//ROOT_URL: "http://localhost:9005"
const socket = io(process.env.ROOT_URL, {
transports: ["websocket"],
reconnection: true,
reconnectionAttempts: Infinity,
});
//Connection event handlers
socket.on("connect", () => {
console.log("Connected to server");
});
socket.on("disconnect", () => {
console.log("Disconnected from server");
});
// Error handling
socket.on("connect_error", (error) => {
console.log("20");
console.dir(error, { depth: null });
});
Подробнее здесь:
https://stackoverflow.com/questions/798 ... ion-failed
1765780091
Anonymous
Я новичок в Socket.io; соединение успешное, «излучает» сигналы тревоги и «включено» успешно прослушивается с обеих сторон. но когда я перезагружаю свой интерфейс, соединение теряется; я неоднократно находил в консоли интерфейса это- [code] code: 'WS_ERR_EXPECTED_FIN', [Symbol(status-code)]: 1002 }, [Symbol(kMessage)]: 'Invalid WebSocket frame: FIN must be set' [/code] }, контекст: неопределенный, тип: 'TransportError' если перезапустить мой внутренний сервер node.js, то снова будет установлено соединение (новое). я думаю, что это проблема моего внутреннего сервера, что я могу сделать? мой внутренний index.js- [code]const http = require("http"); const { initializeSocket } = require("./config/socket"); init(); async function init() { try { db = await mongoose(); console.log("MongoDB Connected!"); } catch (err) { logger.verbose("[index/init]" + err); console.log(33, err); } global.settings = await Settings.findOne(); ... initializeSocket(httpServer); httpServer.listen(process.env.PORT, () => { console.log(`Server running on ${process.env.APP_URL}${process.env.PORT}`); }); } [/code] и мой серверный файл config/socket.js [code]const socketIO = require("socket.io"); const { createAdapter } = require("@socket.io/redis-adapter"); let io = null; const initializeSocket = (httpServer) => { const allowedOrigins = [ "http://localhost:3000", "http://localhost:3002", "http://localhost:4005", "null", //for native apps (Android/iOS) ]; io = socketIO(httpServer, { transports: ["polling", "websocket"], allowUpgrades: true, pingTimeout: 20000, pingInterval: 25000, cors: { origin: (origin, callback) => { console.log("origin", origin); console.log( !origin || origin === "null" || allowedOrigins.includes(origin) ); if (!origin || origin === "null" || allowedOrigins.includes(origin)) { callback(null, true); } else { callback(new Error("Not allowed by CORS")); } }, methods: ["GET", "POST", "OPTIONS"], credentials: true, }, perMessageDeflate: true, }); // Attach Redis adapter // io.adapter(createAdapter(pubClient, subClient)); io.engine.on("connection_error", (err) => { console.log("ENGINE CONNECTION ERROR"); logger.error("ENGINE CONNECTION ERROR", err); console.log(err); }); io.on("connection", function (socket) { const origin = socket.handshake.headers.origin; console.log(`[socket] Client connected: ${socket.id} from ${origin}`); socket.conn.on("upgrade", () => { console.log("UPGRADED TO", socket.conn.transport.name); }); // Operator connects socket.on("operatorConnected", (operatorId) => { const roomName = `operator_${operatorId}`; socket.join(roomName); console.log(`Operator ${operatorId} connected: ${socket.id}`); socket.on("disconnect", () => { socket.leave(roomName); console.log(`Socket ${socket.id} left room ${roomName}`); }); }); socket.on("disconnect", () => { console.log(`[socket] ${socket.id} disconnected`); }); }); console.log("Socket running on same Server !"); }; module.exports = { initializeSocket, getIO: () => io,} [/code] а это мои хуки next.js для интерфейса — [code]import { useEffect, useContext } from "react"; import { socket } from "../../utils/socket"; import { AppContext } from "../context/AppContext"; export default function useOperatorSocket() { const { authUser, setOperatorDrivers } = useContext(AppContext); // CONNECT useEffect(() => { if (!socket.connected) { socket.connect(); } return () => {}; }, []); [/code] и мой next.js utils/socket.js [code]import { io } from "socket.io-client"; //ROOT_URL: "http://localhost:9005" const socket = io(process.env.ROOT_URL, { transports: ["websocket"], reconnection: true, reconnectionAttempts: Infinity, }); //Connection event handlers socket.on("connect", () => { console.log("Connected to server"); }); socket.on("disconnect", () => { console.log("Disconnected from server"); }); // Error handling socket.on("connect_error", (error) => { console.log("20"); console.dir(error, { depth: null }); });[/code] Подробнее здесь: [url]https://stackoverflow.com/questions/79847436/node-js-socket-reconnection-failed[/url]