我创建了一个套接字网关,它可以非常顺利地处理 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 不起作用。
我已经通过在套接字端口上使用代理来修复它,因此如果我的套接字 URL 类似于 https://example.com:5058 那么应该从虚拟主机处理它并添加代理以使其正常工作.
不工作的原因是,当您应用 HTTPS 时,它将在端口 443 上运行。但是现在,当您使用 HTTPS 在 URL 中应用附加端口时,它将无法运行,并且会显示错误。
Apache 反向代理参考:链接
对我来说,解决方案是清空
@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();