Базовый экспресс и сокет.проблема с подключением ввода-вывода

#node.js #typescript #express #socket.io

#node.js #машинописный текст #экспресс #socket.io

Вопрос:

используя базовую экспресс-настройку, я не могу перейти к обратному вызову io.on (‘connect’). соединение просто останавливается

Узел 12.14.1 экспресс 4.17.1 socket.io 3.0.1

код

 import express, { ErrorRequestHandler } from 'express';
import path from 'path';
import {Server} from 'socket.io';
import http from 'http';

import cors from 'cors';
import createError from 'http-errors';
import defaultRouter from './routes';

const app = express();


app.use(cors({origin:'*'}));
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(express.static(path.join(__dirname ,'../public')))

app.get("/",(req,res)=>{return res.sendFile(path.join(__dirname,'public','index.html')) })
app.use(defaultRouter);

app.use((req, res, next) => {
  const { url } = req;
  const message = `Page not found ${url}`;
  next(new createError.NotFound(message));
});

const DefaultErrorHandler: ErrorRequestHandler = (err, req, res, next) => {
  if (err amp;amp; err.statusCode) {
    return res.status(err.statusCode).send(err);
  }
  res.status(500).send('Yeah...my bad');
};
app.use(DefaultErrorHandler);

app.listen(3000, () => {

  console.log('App listening on port 3000');
});

const server =  require('http').createServer(app);
const io = require('socket.io')(server);



io.on('connection', function (socket:any) {
 console.log("connected")

  io.emit("user connected")
  socket.on('disconnect',()=>{console.log('disconnected')})
});
io.use((socket:any, next: any)=>{console.log(socket.request); next()})
server.listen(3001 )
server.on("listening",()=>{console.log('ws listening on 3001')} )
server.on("error",()=>{console.log('error')} )



  

вызов websocket

 $ websocat ws://localhost:3001/socket.io/?EIO=3amp;transport=websocket
>0{"sid":"Q9Jj3CNtm6MSarmEAAAA","upgrades":[],"pingInterval":25000,"pingTimeout":5000}
>2
  

Отладка

   engine handshaking client "Q9Jj3CNtm6MSarmEAAAA"  0ms
  engine:socket sending packet "open" ({"sid":"Q9Jj3CNtm6MSarmEAAAA","upgrades":[],"pingInterval":25000,"pingTimeout":5000})  0ms
  engine:socket flushing buffer to transport  0ms
  engine:ws writing "0{"sid":"Q9Jj3CNtm6MSarmEAAAA","upgrades":[],"pingInterval":25000,"pingTimeout":5000}"  0ms
  engine:transport setting request  0ms
  socket.io:server incoming connection with id Q9Jj3CNtm6MSarmEAAAA  4s
  engine:socket writing ping packet - expecting pong within 5000ms  25s
  engine:socket sending packet "ping" (undefined)  1ms
  engine:socket flushing buffer to transport  0ms
  engine:ws writing "2"  25s
  engine:ws closing  5s
  socket.io:client client close with reason ping timeout  0ms
  socket.io:client no namespace joined yet, close the client  15s
  

при использовании firecamp это подключается и отключается непрерывно и не будет подключаться к транспорту опроса

я не уверен, что происходит с этим подключением, я разбил его как можно проще и получил тот же результат, примечание, я не получаю уведомление о pong на firecamp. Я разбил его до минимального и так и не достиг «подключенного» блока

Комментарии:

1. какая версия у клиента?

2. Когда клиент продолжает пытаться подключиться снова и снова и каждый раз получает отказ от сервера, это обычно признак того, что у вас несоответствующие версии сокета. ввод-вывод на клиенте и сервере. Кроме того, вы понимаете, что можете запускать сокет. ввод-вывод и экспресс на одном http-сервере (и, следовательно, на том же порту)? Нет причин использовать отдельный сервер / порт для socket.io . Это также может упростить проблемы с тем же источником.

3. спасибо, jfriend, я это исправлю. @lawrence-cherone я использую websocat в терминале и firecamp, с которыми у меня не было проблем в сокете feathersjs. сервер ввода-вывода

4. ОБНОВЛЕНИЕ похоже, что это клиент, я извлек пример html из сокета. веб-сайт ввода-вывода и обслуживал его на моем index.html , никаких проблем нет, но это всегда может быть что-то корс

5. @ NoahWallace Основатель Firecamp здесь, эта проблема должна быть CORS. пожалуйста, разрешите CORS в среде разработки.

Ответ №1:

Я знаю, что это упоминается в комментариях, но это было трудно найти, и это очень недооцененный ответ:

Убедитесь, что ваши клиентские и серверные версии сокета.io выровнены (просто получите последнюю версию обоих, чтобы быть уверенным).

Некоторое время я боролся с проблемами подключения, и это было потому, что другая библиотека, которую я использую, уже установила более низкую версию socket.сервер ввода-вывода для собственного использования.

Я даже не установил сокет.ввод-вывод на сервере сам, но когда я импортировал его, импорт сработал, потому что он нашел сокет.ввод-вывод, установленный этой библиотекой.

Мне просто нужно было запустить npm install --save socket.io , и мои проблемы с подключением исчезли.

Ответ №2:

Существует проблема с вашей конфигурацией. следуйте приведенному ниже коду, который отлично протестирован.

  const app = express();
 var http = require("HTTP");
 var server=http.createServer(app).listen(2525, (req, res) => {
  console.log("Server running on", 2525);
 });
 var socketIO = require("socket.io");
 var io = socketIO(server);
 io.on("connection", async (socket) => {
   console.log("connected")

   io.emit("user connected")
   socket.on('disconnect',()=>{console.log('disconnected')})
 });
  

Это для создания сервера и сокета в одном порту, добавьте свой другой код по мере необходимости.