GraphQL-подписки: как получить опубликованный объект в решателе подписок
Я использую экспресс-сервер с подписками GraphQL и subscription-transport-ws.
Я настроил подписку с указанным каналом:
...
const subscriptionManager = new SubscriptionManager({
schema: executableSchema,
pubsub: pubsub,
setupFunctions: {
testRunChanged: (options, args) => {
return {
testRunChangedChannel: {
filter: (testRun) => {
return testRun.id === args.testRunId;
}
},
};
},
},
});
...
После получения мутации на сервере запускается процесс, где запись базы данных тестового прогона обновляется по завершении. Теперь, когда обещание обновления для действия базы данных проходит, клиент должен быть проинформирован.
Используя функцию публикации из pubsub, менеджер подписки получает информацию об обновленном тестовом прогоне:
...
RunningTestDbService.setToFinished(testRun).then(updatedTestRun => {
pubsub.publish("testRunChangedChannel", updatedTestRun);
})
...
После того, как менеджер подписок отфильтрует подписки в зависимости от опубликованного testRun и подписанного testRunId, вызывается функция распознавателя подписок. Чтобы обновить клиента, мне нужно снова загрузить обновленный тестовый запуск.
Как получить опубликованный объект тестового прогона внутри функции распознавателя подписки?
Подписка и распознаватель выглядят так:
...
`testRunChanged(testRunId: ID!): TestRun!`
...
Subscription: {
testRunChanged(_, { testRunId }) {
// need to fetch the test run from database again
return TestRunDbService.getTestRunWith(testRunId);
},
},
...
1 ответ
Объект, используемый в publish
метод в качестве полезной нагрузки, то root
параметр вашей подписки resolver
метод - так что в этом случае это _
в вашем testRunChanged
функция резольвера. Вы должны просто сделать return _
,