特定于用户的发布(订阅)

时间:2018-08-07 10:37:26

标签: graphql apollo apollo-server graphql-subscriptions

这是我遇到的一个小问题,在文档中找不到太多信息。我正在尝试创建私人聊天消息。我们有以下代码可为用户订阅主题:

export const resolvers = {
  Subscription: {
    somethingChanged: {
      subscribe: () => pubsub.asyncIterator('chat_messages'),
    },
  },
}

并发布

pubsub.publish('chat_messages', { somethingChanged: { sender_id: 1, receiver_id: 2, message: 'test' }});

我已使用onConnect验证用户是否已通过身份验证

const server = new ApolloServer({
    typeDefs,
    resolvers,
    subscriptions: {
        onConnect: (connectionParams, webSocket) => {
            ...
            if (!authenticated) throw error
            ...
        },
    },
   ...
})

例如,当我想为用户订阅特定主题时,此方法效果很好。但是,如何实现私人用户与用户之间的通信?我已经尝试过withFilter,但似乎无法实现用户特定的授权(就消息而言)检查。

1 个答案:

答案 0 :(得分:2)

这是一个演示:https://github.com/mrdulin/apollo-server-express-starter/tree/master/src/subscription/demo-1

具有以下功能:

    基于
  1. jwt的Websocket连接身份验证

  2. 用户通道,这意味着谁可以接收消息,谁不能接收消息。

您需要了解一些概念:

  1. 用户有两种类型: requestUser subscribeUsers(包括requestUser)

  2. 您应该在filterFn中编写代码,以了解谁可以接收requestUser发送的消息。

例如:

有3个订阅用户:s1(client-1),s2(client-2),s3(client-3)

请求用户(客户端-4)发送消息(可能是突变)时,您可以通过以下方式获取订阅用户请求用户 context的{​​{1}}自变量。

根据这两种类型filterFn信息。您可以在users'中编写自己的业务逻辑,以决定谁可以接收消息,谁不能接收消息。

P.S。在filterFn旁边,您可以从客户端获取context中的variables自变量。这样可以提供更多信息,以决定哪些人可以接收消息,哪些人不能接收消息

对不起,我的英语!