这是我遇到的一个小问题,在文档中找不到太多信息。我正在尝试创建私人聊天消息。我们有以下代码可为用户订阅主题:
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
,但似乎无法实现用户特定的授权(就消息而言)检查。
答案 0 :(得分:2)
这是一个演示:https://github.com/mrdulin/apollo-server-express-starter/tree/master/src/subscription/demo-1
具有以下功能:
jwt
的Websocket连接身份验证
用户通道,这意味着谁可以接收消息,谁不能接收消息。
您需要了解一些概念:
用户有两种类型: requestUser 和 subscribeUsers(包括requestUser)
您应该在filterFn
中编写代码,以了解谁可以接收requestUser
发送的消息。
例如:
有3个订阅用户:s1(client-1),s2(client-2),s3(client-3)
当请求用户(客户端-4)发送消息(可能是突变)时,您可以通过以下方式获取订阅用户和请求用户 context
的{{1}}自变量。
根据这两种类型filterFn
信息。您可以在users'
中编写自己的业务逻辑,以决定谁可以接收消息,谁不能接收消息。
P.S。在filterFn
旁边,您可以从客户端获取context
中的variables
自变量。这样可以提供更多信息,以决定哪些人可以接收消息,哪些人不能接收消息
对不起,我的英语!