如何修复套接字 io 中的 400 错误错误请求?

Posted

技术标签:

【中文标题】如何修复套接字 io 中的 400 错误错误请求?【英文标题】:How to fix 400 error bad request in socket io? 【发布时间】: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");
      ,
    ,

【问题讨论】:

【参考方案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,我的问题就解决了。

以上是关于如何修复套接字 io 中的 400 错误错误请求?的主要内容,如果未能解决你的问题,请参考以下文章

socket.io 和 node.js 400 错误请求

如何修复:远程服务器返回错误:(400)错误请求

将套接字从电子 UI 连接到 python 服务器时出现错误 400(错误请求)

如何从 Gmail 应用程序嵌入式 Safari 浏览器在 iOS 上调试“400 错误请求”

打开网页出现400 Bad Request错误,是怎么回事

http400错误啥意思,怎样解决呢?