Почему при перезагрузке сервера у меня каждый раз добавляется один вебсокет?
стоит nodemon я не вношу изменений в сервер, просто нажимаю сохранить, он перезагружает сервер и на клиенте у меня каждый раз +1 соединение, 1 из них постоянно обменивается. Вопрос следующий - почему старое продолжает висеть со статусом 101? или это нормальное поведение?
export const socketMiddleware = ( wsActions: TSocketChatMiddlewareActions ): Middleware<{}, RootState> => { return (store) => { let socket: Socket | null = null return (next) => (action) => { const { dispatch } = store const { wsConnect, wsDisconnect, wsSendMessage, wsConnecting, wsOnOpen, wsOnClose, wsOnError, wsOnMessage, } = wsActions if (wsConnect.match(action)) { console.log('connect', socket) socket = io('http://localhost:5000', { path: '/api/messages', transports: ['websocket'], reconnectionDelay: 5000, }) dispatch(wsConnecting()) } if (socket) { socket.on('connect', () => { console.log('socket open = ', socket!.id) // dispatch(wsOnOpen()) }) socket.on('connect_error', (error) => { console.log('socket error', error.message) // dispatch(wsOnError(`Error === ${error.message}`)) }) socket.on('disconnect', (reason: any) => { console.log('socket close', reason) // dispatch(wsOnClose()) }) if (wsDisconnect.match(action)) { console.log('socket disconnect') socket.disconnect() socket = null dispatch(wsOnClose()) } } next(action) } } } |
export const socketMiddleware = ( wsActions: TSocketChatMiddlewareActions ): Middleware<{}, RootState> => { return (store) => { let socket: Socket | null = null return (next) => (action) => { const { dispatch } = store const { wsConnect, wsDisconnect, wsSendMessage, wsConnecting, wsOnOpen, wsOnClose, wsOnError, wsOnMessage, } = wsActions if (wsConnect.match(action)) { console.log('connect', socket) socket = io('http://localhost:5000', { path: '/api/messages', transports: ['websocket'], reconnectionDelay: 5000, }) dispatch(wsConnecting()) } if (socket) { socket.on('connect', () => { console.log('socket open = ', socket!.id) // dispatch(wsOnOpen()) }) socket.on('connect_error', (error) => { console.log('socket error', error.message) // dispatch(wsOnError(`Error === ${error.message}`)) }) socket.on('disconnect', (reason: any) => { console.log('socket close', reason) // dispatch(wsOnClose()) }) if (wsDisconnect.match(action)) { console.log('socket disconnect') socket.disconnect() socket = null dispatch(wsOnClose()) } } next(action) } } }
Дополнительно:
может быть, что это особенности дебаг режима?
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

При перезагрузке сервера у вас каждый раз добавляется один вебсокет, вероятно, потому что вы не закрываете соединение с вебсокетом после завершения работы. Это может привести к накоплению открытых соединений с вебсокетом при каждой перезагрузке сервера.
Чтобы решить эту проблему, необходимо убедиться, что вы закрываете соединение с вебсокетом перед завершением работы сервера. Для этого вам нужно добавить обработчик события закрытия сервера, который будет закрывать все активные соединения с вебсокетом.
Пример кода на PHP:
// Создаем новый сервер вебсокета $server = new WebSocket\Server('127.0.0.1', 8080); // Обработчик события закрытия сервера $server->on('close', function () use ($server) { // Закрываем все активные соединения с вебсокетом foreach ($server->getConnections() as $connection) { $connection->close(); } }); // Запускаем сервер $server->run();
Этот код добавляет обработчик события закрытия сервера, который закрывает все активные соединения с вебсокетом перед завершением работы сервера. Таким образом, при каждой перезагрузке сервера не будет добавляться новое соединение с вебсокетом.
Надеюсь, данное решение поможет вам решить проблему с накоплением открытых соединений с вебсокетом при перезагрузке сервера. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать их.