【问题标题】:How to fix 400 error bad request in socket io?如何修复套接字 io 中的 400 错误错误请求?
【发布时间】:2021-02-19 20:05:00
【问题描述】:

我有一个前端应用程序(VUE JS)

我有一个后端(Nest JS)

Vue JS 应用程序使用 vue-socket.io-extended 库通过 websockets 从后端获取数据 当 Vue JS 应用程序启动时,我在浏览器中看到错误:

polling-xhr.js?d33e:229 POST http://localhost:11050/socket.io/?EIO=4&transport=polling&t=NMXgCF1 400(错误请求)

如何解决此错误?

我认为它没有与库连接,我尝试了只是socket io库,结果是一样的。

服务器正在工作,因为它发送日志并显示谁已连接:

服务器(Nest JS) main.ts 文件:

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.enableCors();
  await app.listen(11050);
}
bootstrap();

App.gateway:

@WebSocketGateway()
export class AppGateway implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect {


  private logger: Logger = new Logger('AppGatway');

  @SubscribeMessage('msgToServer')
  handleMessage(client: Socket, text: string): WsResponse<string> {
    return { event: 'msgToClient', data: text };
  }

  afterInit(server: Server) {
    this.logger.log('Initialised!');
  }

  handleConnection(client: Socket, ...args: any[]): any {
    this.logger.log(`Client connected: ${client.id}`);
  }

  handleDisconnect(client: Socket): any {
    this.logger.log(`Client disconnected: ${client.id}`);
  }
}

前端(Vue JS):

import VueSocketIOExt from "vue-socket.io-extended";
import Vue from "vue";
import io from "socket.io-client";
const socket = io("http://localhost:11050/");

Vue.use(VueSocketIOExt, socket);

data: () => ({
socket: null,
    connection: null,
    sockets: {
      connect() {
        console.log("socket connected");
      },
    },
}

【问题讨论】:

    标签: javascript vue.js websocket socket.io nestjs


    【解决方案1】:

    以下代码有此问题:

    App.js

    const io = require('socket.io')(server, {pingTimeout: 60000});
    

    clientSocket.js

    var socket = io("http://localhost:3003/")
    

    正如 Rahit 所说,我必须添加“allowEIO3: true”,但还必须从 localhost 更改为我的 IP 地址。

    【讨论】:

      【解决方案2】:

      解决方案socket v3,添加

       allowEIO3: true
      

      【讨论】:

        【解决方案3】:

        您需要在客户端和服务器上使用相同的版本

        【讨论】:

        • 在接受的答案中:the issue is related to mismatched socket.io server and client versions
        • foxer lee 的回答中也提到了。
        【解决方案4】:

        我遇到了类似的问题,并通过将 socket.io.js 文件版本更改为与您的 socket.io 软件包版本相同来解决它。

        【讨论】:

          【解决方案5】:

          通过更新 socket.io.js 文件修复了我的问题

          【讨论】:

          • 请详细说明您在 socker.io 文件中更新了什么?
          【解决方案6】:

          记住,来源是请求的服务器

          const io = SocketIO(server,{
                  cors: {
                          origin: "http://localhost",
                          methods: ["GET", "POST"],
                          credentials: true,
                          transports: ['websocket', 'polling'],
                  },
                  allowEIO3: true
                  })
          

          【讨论】:

            【解决方案7】:

            服务器端

            尝试以下配置
            const io = require('socket.io')(server, {
                cors: {
                    origin: "http://localhost:8100",
                    methods: ["GET", "POST"],
                    transports: ['websocket', 'polling'],
                    credentials: true
                },
                allowEIO3: true
            });
            

            【讨论】:

            • 感谢您的回答!
            • 谢谢,让 EIO3 帮助了我。我找不到连接到不在 EIO4 上的生产服务器的内容。
            【解决方案8】:

            我通过将客户端中的 socket.io-client 版本从 ^3.2.0 降级到 ^2.3.1 解决了这个问题。

            我在 ReactJs 中的 package.json 客户端:

            "dependencies": { "@testing-library/jest-dom": "^5.11.8", "@testing-library/react": "^11.2.3", "@testing-library/user-event": "^12.6.0", "@types/jest": "^26.0.20", "@types/node": "^12.19.12", "@types/react": "^16.14.2", "@types/react-dom": "^16.9.10", "moment": "^2.29.1", "react": "^17.0.1", "react-dom": "^17.0.1", "react-moment": "^1.1.1", "react-scripts": "4.0.1", "socket.io-client": "^2.3.1", "typescript": "^4.1.3", "web-vitals": "^0.2.4" }

            在我使用 Nestjs 作为 API REST 和 SocketServer 的服务器中,我的 package.json 是: "dependencies": { "@nestjs/common": "^7.5.1", "@nestjs/config": "^0.6.1", "@nestjs/core": "^7.5.1", "@nestjs/mongoose": "^7.2.1", "@nestjs/platform-express": "^7.5.1", "@nestjs/platform-socket.io": "^7.6.5", "@nestjs/swagger": "^4.7.10", "@nestjs/websockets": "^7.6.5", "class-validator": "^0.13.1", "mongoose": "^5.11.11", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^6.6.3", "swagger-ui-express": "^4.1.6" }

            希望对你有帮助,问候

            解决方案在:Gitlab report

            【讨论】:

              【解决方案9】:

              我今天使用非常相似的 NestJS 实现遇到了这个问题,但是我的前端是用 ReactJS 编写的。我认为这个问题与不匹配的 socket.io 服务器和客户端版本有关。

              我通过将socket.io-client 的版本从^3.0.0 降级到^2.3.0 解决了这个问题。

              【讨论】:

              • 你可以分享你的报告吗?...我也有同样的问题:(
              • 这修复了我,在 2021 年 3 月...:|
              • 谢谢,但是如何使用更高版本的socket?
              • @MojtabaDarzi 转到socket.io/docs/v4/server-installation, socket.io/docs/v4/client-installation 并相应地选择服务器-客户端版本
              • 这是我的问题,我需要我的 socket.io-client 和 socket.io 版本来匹配。我的后端是 socket.io 4.40,我的客户端是 socket.io-client 2.4.0。我在我的前端做了 npm uninstall socket.io-client,然后做了 npm install socket.io-client@4.4.0,我的问题就解决了。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-07-09
              • 1970-01-01
              • 2020-01-13
              • 2020-04-01
              • 2017-03-17
              • 2020-04-19
              • 1970-01-01
              相关资源
              最近更新 更多