NodeJS Chrome v88+和Nestjs服务器上的socket-io连接出现CORS错误

az31mfrm  于 2023-05-22  发布在  Node.js
关注(0)|答案(3)|浏览(112)

我有一个应用程序连接到Nestjs服务器以建立WS连接(服务器位于不同的URL上,因此它是一个CORS请求)。
WebsocketGateway就是这样定义的。

@WebSocketGateway(port, {
  handlePreflightRequest: (req, res) => {
    const headers = {
      'Access-Control-Allow-Headers': 'Authorization',
      'Access-Control-Allow-Origin': 'the page origin',
      'Access-Control-Allow-Credentials': true,
    };
    res.writeHead(200, headers);
    res.end();
  }
})

在Chrome v87和Firefox上都能很好地工作。自从我的浏览器升级到Chrome 88后,前端socket-io连接就进入了一个连接-重新连接循环,如下所示:

  1. preflight请求通过并获得一个200的响应,其头部设置在上面;
    1.实际连接失败,浏览器控制台中显示唯一消息CORS error
0yg35tkg

0yg35tkg1#

只是以防别人需要这个,在您的decorator有一个cors属性

@WebSocketGateway({ cors: true })
b1uwtaje

b1uwtaje2#

这就是我如何修复的

import { IoAdapter } from '@nestjs/platform-socket.io';
import { ServerOptions } from 'socket.io';

export class SocketAdapter extends IoAdapter {
  createIOServer(
    port: number,
    options?: ServerOptions & {
      namespace?: string;
      server?: any;
    },
  ) {
    const server = super.createIOServer(port, { ...options, cors: true });
    return server;
  }
}

main.ts

const app = await NestFactory.create(AppModule, { cors: true });
app.useWebSocketAdapter(new SocketAdapter(app));
11dmarpk

11dmarpk3#

如果使用cookie身份验证,请确保将凭据cors属性设置为true。例如:

@WebSocketGateway({
  cors: {
    origin: [IPs],
    credentials: true,
  },
  transports: ['websocket', 'polling'],
})

相关问题