Пользовательская публикация (подписки)
Вот небольшая проблема, с которой я столкнулся и не смог найти много информации в документации. Я пытаюсь создать личные сообщения чата. У нас есть следующий код для подписки пользователя на тему:
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 ответ
Вот демоверсия: https://github.com/mrdulin/apollo-server-express-starter/tree/master/src/subscription/demo-1
С этими функциями:
jwt
на основе аутентификации для подключения через веб-сокетПользовательский канал, который означает, кто может получать сообщения, кто не может.
Есть несколько концепций, которые вам нужно знать:
есть два типа пользователя: requestUser и subscribeUsers (включая requestUser)
Вы должны написать код в
filterFn
для тех, кто может получить сообщение, котороеrequestUser
Отправить.
Например:
Есть три подписавшихся пользователя: s1(клиент-1), s2(клиент-2), s3(клиент-3)
Когда пользователь запроса (клиент-4) отправляет сообщение (возможно, мутацию), вы можете получить подписку пользователей и запросить пользователей через context
аргумент filterFn
,
По этим двум типам users'
информация. Вы можете написать свою собственную логику бизнеса в filterFn
решить, кто может получить сообщение, а кто нет.
PS рядом context
, ты можешь получить variables
аргумент в filterFn
от клиента. Это даст больше информации, чтобы решить, кто может получать сообщения, а кто нет
Извините за мой английский!