【问题标题】:How to access socket.io client id from controller NestJS?如何从控制器 NestJS 访问 socket.io 客户端 ID?
【发布时间】:2022-01-11 11:41:10
【问题描述】:

我正在开发 webhook 上的聊天支持。我使用聊天聚合器,这不是我的个人服务。因此,每当有任何消息来自支持时,我都会在我的控制器中收到它,任务是通过websockets 将此消息传递给我的客户。问题是我无法将消息发送到特定的套接字,所以我需要知道它的 id。 有以下代码:

@Controller('chat')
export class ChatController {
    @UseInterceptors(CamelCaseConverterInterceptor)
    @Post()
    getExternalMessage(
        @Body() payload: WebhookChatMessageDto,
        @ConnectedSocket() client: Socket,
    ): void {
       ... code
    }
}

我希望获得当前的套接字客户端 ID,但似乎 @ConnectedSocket() 装饰器在控制器中不起作用。有什么想法吗?

【问题讨论】:

    标签: socket.io nestjs


    【解决方案1】:

    您不需要在控制器方法中使用装饰器。第一个参数是socket,第二个是payload。所以在你的方法中:

    getExternalMessage(
            client: Socket,
            payload: WebhookChatMessageDto,
        ): void {
           console.log(client.id); //client id
           client.emit(...); //emit to this client
        }
    

    但是如果你想使用 websocket 端点,这不应该是 @Post() 而是使用 @SubscribeMessage('someMessage')。在 post 请求中,您将永远无法访问 socket 客户端,因为这是通过不同端口进行的通信,并且您无法将 post 请求与用户 socket.io 连接配对

    【讨论】:

    • 这段代码似乎不起作用(我无法删除 @Post 装饰器,因为外部源向我发送了 post 请求)。那么,如果我无法访问控制器中的套接字实例——我该怎么办?
    • 不,我没有说 :) 您可以访问后端的套接字实例。但是你找不到客户端的socket.io clientId。如果你必须实现这个发布路由,你需要添加额外的参数,客户端发送他的客户端 ID。比这个参数不会是Socket,而是简单的字符串。你必须通过这个字符串从你的套接字中找到合适的客户端
    • 什么意思?我删除了@ConnectedSocket() 装饰器,似乎客户端参数未定义。如果不这样做,我会收到错误的实例(IncomingMessage 实例)...
    • 只需从您的方法中删除客户端参数。它将是 getExternalMessage(@Body() payload: WebhookChatMessageDto) 并扩展 WebhookChatMessageD 以添加新密钥,例如 socketId: string。这必须将前端发送到您的后端。之后,你需要在你的socket服务器实例中找到这个socketId来获取客户端实例
    • no-no-no, external source/message -- 它是聊天聚合器,根本不是我的服务。我无法从此服务发送套接字 ID,因为我对此没有任何权限。由于我的 cors 政策,我的前端也无法向此端点发送请求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 2021-01-25
    • 2016-11-16
    • 2022-07-06
    • 2014-02-06
    • 1970-01-01
    • 2019-09-22
    相关资源
    最近更新 更多