graphql - 用户特定的发布(订阅)

标签 graphql apollo apollo-server graphql-subscriptions

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

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
            ...
        },
    },
   ...
})

例如,当我想为用户订阅特定主题时,这很有效。但如何实现私有(private)用户与用户之间的通信呢?我已经尝试过 withFilter 但似乎无法实现用户特定的授权(相对于消息)检查。

最佳答案

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

具有以下功能:

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

  2. 用户 channel ,即谁可以接收消息,谁不能接收消息。

您需要了解一些概念:

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

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

例如:

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

请求用户(client-4)发送消息(可能突变)时,您可以通过以下方式获取订阅用户请求用户 filterFncontext 参数。

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

附注除了context之外,您还可以从客户端获取filterFn中的variables参数。这将提供更多信息来决定谁可以接收消息,谁不能接收消息

对不起我的英语!

关于graphql - 用户特定的发布(订阅),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51724722/

相关文章:

testing - 如何测试 GraphQl API?

graphql - 为什么使用 Apollo GraphQL Server Express(或其他集成)?

javascript - 使用 Graphql 和 React,我无法从默认导出访问函数

graphql - 是否可以在 GraphQL 查询中使用嵌套/命名空间查询变量?

graphql - apollo graphql 模式 react-admin 初学者

javascript - 如何使用 "graphql-request"返回http状态代码?

javascript - 下一个/React-Apollo : React props not hooked up to apollo cache when query comes from getInitialProps

node.js - Apollo Client V2 获取数据的顺序错误

javascript - 如何在 React + Apollo GraphQL 中查询先前查询的结果?

javascript - 使用 apollo 服务器设置 auth0