如何在NestJs中通过https创建套接字?

问题描述 投票:0回答:2

我创建了一个套接字网关,它可以非常顺利地处理 HTTP 请求。现在,我尝试通过 NestJs 中的 https 请求连接套接字,但对我不起作用。 我还尝试在

@WebsocketGateway(5058, { origin : "*:*", secure: true })

中提供额外的参数

我还检查了 NestJs 官方文档以在套接字上使用 SSL,但什么也没找到。

下面是我根据文档创建的代码。

import { InternalServerErrorException, BadRequestException } from '@nestjs/common';
import { SocketService } from './socket/socket.service';
import { Server, Socket } from 'socket.io';

@WebSocketGateway(5058, { origin : "*:*"} )
export class AppGateway implements OnGatewayConnection, OnGatewayInit {

    constructor(private socketService: SocketService) { }

    public userIds = [];

    afterInit(server: Server) {
        console.log("Socket server started");
        this.socketService.socket = server;
    }

    async handleConnection(client) {

        try {
            console.log(client.id);
            this.socketService.socket.to(client.id).emit('status', "connected = " + client.id);
        } catch (error) {
            throw new InternalServerErrorException(
                `Oops.something went wrong, please try again later`,
            );
        }
    }

    async handleDisconnect(client) {
        this.userIds = this.userIds.filter(user => user.conn_socket_id !== client.id);
    }
}

编辑:

我可以在使用 HTTP 请求时启动服务器并访问套接字,但无法通过 HTTPS 请求访问套接字。 前任。 http://example.com:5058 正在为我工作, https://example.com:5058 不起作用。

ssl websocket socket.io nestjs
2个回答
0
投票

我已经通过在套接字端口上使用代理来修复它,因此如果我的套接字 URL 类似于 https://example.com:5058 那么应该从虚拟主机处理它并添加代理以使其正常工作.

不工作的原因是,当您应用 HTTPS 时,它将在端口 443 上运行。但是现在,当您使用 HTTPS 在 URL 中应用附加端口时,它将无法运行,并且会显示错误。

Apache 反向代理参考:链接


0
投票

对我来说,解决方案是清空

@WebSocketGateway()
参数,然后添加
app.useWebSocketAdapter(new IoAdapter(app));
在主文件上像这样:

    import { NestFactory } from '@nestjs/core';
    import { AppModule } from './app.module';
    import { ValidationPipe } from '@nestjs/common';
    import { NestExpressApplication } from '@nestjs/platform-express';
    import { IoAdapter } from '@nestjs/platform-socket.io';
    
    async function bootstrap() {
      const fs = require('fs');
      const keyFile  = fs.readFileSync(`./certificates/private.key`);
      const certFile = fs.readFileSync(`./certificates/certificate.crt`);
      const ca = fs.readFileSync(`./certificates/ca_bundle.crt`);
    
      const app = await NestFactory.create<NestExpressApplication>(AppModule, {
        httpsOptions: {
          key: keyFile,
          cert: certFile,
          ca: ca,
        },
        cors: {
          origin: '*'
        }
      });
      app.useGlobalPipes(new ValidationPipe());
      app.useWebSocketAdapter(new IoAdapter(app));
      await app.listen(process.env.PORT!);
      console.log(`Listenning on port: ${process.env.PORT}`);
    }
    bootstrap();
© www.soinside.com 2019 - 2024. All rights reserved.