如何修复套接字 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 错误错误请求?的主要内容,如果未能解决你的问题,请参考以下文章
将套接字从电子 UI 连接到 python 服务器时出现错误 400(错误请求)