这是我遇到的一个小问题,在文档中找不到太多信息。我正在尝试创建私有(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
具有以下功能:
jwt
基于 websocket 连接的身份验证用户 channel ,即谁可以接收消息,谁不能接收消息。
您需要了解一些概念:
有两种类型的用户:requestUser和subscribeUsers(包括requestUser)
您应该在
filterFn
中编写代码,以便谁可以接收requestUser
发送的消息。
例如:
有三个订阅用户:s1(client-1)、s2(client-2)、s3(client-3)
当请求用户(client-4)发送消息(可能突变)时,您可以通过以下方式获取订阅用户和请求用户 filterFn
的 context
参数。
根据这两个类型用户
信息。您可以在filterFn
中编写自己的业务逻辑来决定谁可以接收消息,谁不能。
附注除了context
之外,您还可以从客户端获取filterFn
中的variables
参数。这将提供更多信息来决定谁可以接收消息,谁不能接收消息
对不起我的英语!
关于graphql - 用户特定的发布(订阅),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51724722/