GraphQL 订阅特定房间的(按 roomId)设置更改

Posted

技术标签:

【中文标题】GraphQL 订阅特定房间的(按 roomId)设置更改【英文标题】:GraphQL subscribe to specific room's (by roomId) settings change 【发布时间】:2021-03-14 18:07:37 【问题描述】:

我想使用 gql 订阅来观察游戏房间的设置变化。我有具有唯一房间代码的房间列表。每个房间都有设置属性。

例子:

class Room 
  roomCode: string;
  settings: 
    difficulty
    otherSetting
  

现在我想订阅房间的设置更改(NestJS 示例):

@Subscription((type) => RoomSetting)
async roomSettingsChanged(@Args("roomCode") roomCode: RoomCode) 
  return this.pubSub.asyncIterator("roomSettingsChanged");


@Mutation((type) => RoomSetting)
async changeRoomSettings(
  @Args("roomCode") roomCode: RoomCode,
  @Args("RoomSettingsData") roomSettingsData: RoomSettingsData
): Promise<RoomSetting> 
  const newRoomSettings = await this.roomsSerive.changeRoomSettings(
    roomCode,
    roomSettingsData
  );
  this.pubSub.publish("roomSettingsChanged", 
    roomSettingsChanged: newRoomSettings,
  );
  return newRoomSettings;

RoomSettings 的样子:

RoomSettings 
  difficulty: "hard",
  otherSetting: "blabla"

现在我如何在订阅中使用我传入订阅参数的 RoomCode 识别某些房间设置属于房间?我可以在 pubSub.publish 中的一些额外变量中传递 roomCode 吗?或者也许在 pubSub 我应该通过设置传递整个 Room 对象(然后如何在订阅解析器中获取设置)? RoomSettings 没有任何标识值(只是属于具有唯一 roomCode 的 Room)。我想实现这个场景:

    有人订阅了“roomSettingsChanged”并将 roomCode 作为参数传递 当有人更改房间设置时,订阅该房间设置更改的客户端会收到更新值的通知。

【问题讨论】:

【参考方案1】:

我可能找到了似乎按预期工作的解决方案。在订阅触发字符串中附加 roomCode,例如:

this.pubSub.asyncIterator("roomSettingsChanged" + roomCode);

【讨论】:

以上是关于GraphQL 订阅特定房间的(按 roomId)设置更改的主要内容,如果未能解决你的问题,请参考以下文章

腾讯云使用liveRoom开启直播时,报“房间已存在”错误?

socket.io多房间聊天

如何将 socket.io 与 graphql 订阅一起使用?

MySql 查询以查找给定日期“从”和“到”可用的房间

AppSync GraphQL 订阅以分组数据

对 axios 请求使用动态参数