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

Posted

技术标签:

【中文标题】Chrome v88+ 和 Nestjs 服务器上的 socket-io 连接出现 CORS 错误【英文标题】:CORS error with socket-io connections on Chrome v88+ and Nestjs server 【发布时间】:2021-05-03 13:04:36 【问题描述】:

我有一个应用程序连接到 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 连接进行了一个连接-重新连接循环,如下所示:

    预检请求通过并获得 200 响应,上面设置了标头; 实际连接失败,CORS error 作为浏览器控制台中的唯一消息

【问题讨论】:

【参考方案1】:

以防其他人需要这个,在你的装饰器中有一个 cors 属性

@WebSocketGateway( cors: true )

【讨论】:

谢谢!为我工作。应该被接受为正确答案。 这成功了!请记住在服务器和客户端之间对齐 socket.io 的版本的一个小注意事项(我被困在这个问题上,即使在使用不同版本时添加了 cors: true )。 谢谢谢谢谢谢!我正在潜入一个令人讨厌的代码兔子洞,试图让它工作。这确实需要在核心文档中! 如果我将其设置为仅 true,是否会限制连接?如何限制连接?【参考方案2】:

我就是这样解决的

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));

【讨论】:

它有效,谢谢。但我不知道这样做是否正常。我认为它必须直接在Nest中实现或者应该在文档中 那真是太棒了!它结束了数小时的彻底荒凉。 :) 在解决问题数小时后,您救了我的命。图例。

以上是关于Chrome v88+ 和 Nestjs 服务器上的 socket-io 连接出现 CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章

转换原点 (css) Chrome (88) 错误

当类型是 Record <k,v> - NestJS 时,类验证器不起作用

Typegoose 和 NestJS:类型上不存在属性“保存”

WebSocket SocketIO 连接不适用于 Heroku 上的 NestJS 服务器并在 Vercel 上反应客户端

Chrome 88 更改在 translate3d 过渡期间导致图像模糊

Chrome v33.0.1750.154 中的断点未命中