Вопросы с тегами [graphql-subscriptions]

0

голосов
0

ответ
4

Просмотры

подписка на Java graphQL для IBM MQ Темы

Я новичок в graphQL и пытаюсь создать подписку на тему MQ. Я хочу на основе событий обновления, всякий раз, когда я получаю сообщение graphQL API должен закачает и показать обновления. Все указатели будут полезны для понимания подписок с JMS. Спасибо
Priya Tanwar
1

голосов
0

ответ
190

Просмотры

Spring загрузка graphql-Java, подписка и streamlisteners

Я пытаюсь создать наблюдаемую из ответа streamlistener, но не в состоянии сделать это. Я совершенно новой идее EventObservable и реактивная Java. Было бы полезно, если бы кто-то может заглянуть в мой код, чтобы увидеть, если он был построен правильный путь, и если мое понимание концепции находится на правильном пути. @Component общественного класса EventObservable {частное Наблюдаемого наблюдаемый = новый Наблюдаемый () {@Override защищен недействительный subscribeActual (наблюдатель
1

голосов
0

ответ
324

Просмотры

graphql-подписка withFilter возвращает неопределенное значение; подписки без переменных работать нормально

Я пытаюсь получить мою голову вокруг graphql-подписки и withFilter. Подписки без переменных работать, как задумано, но если я пытаюсь использовать withFilter, я получаю только «Подписка поле должно вернуть Async Iterable. Полученное: не определено»Ошибка при попытке запустить подписку. Я делаю что-то неправильно с настройкой withFilter, являются некоторые несовместимости с пакетами я использую или я полностью отсутствует что-то очевидное здесь? Все запросы и мутации работают должным образом, поэтому базовый набор вверх должно быть хорошо. Мой набор вверх похож на это (все фрагменты кода в https://gist.github.com/aqmattil/41e10e7c9f30b8ea964cecdc61c58f20 Package.json // package.json «зависимости»: { «аполлон-сервер-экспресс»: «^ 2,0 0,0-beta.2" , "тело-анализатор": "^ 1.18.3", "экспресс": «^ 4.16. siteAdded», { 'siteAdded': сайт}); вернуться сайт; }}}}); module.exports = мутация; Подписка // subscriptions.js Const graphql = требуется ( 'graphql'); Const {GraphQLObjectType, GraphQLString} = graphql; Const {withFilter} = требуется ( 'graphql-подписки'); Const SiteType = требуется ( './ site_type'); Const PubSub = требуется ( './ pubsub_helper'); Const Подписки = новый GraphQLObjectType ({имя: 'подписки', поля: () => ({/ * // этот код работает, закомментированы испытать withfilter siteAdded: {Тип: SiteType, решительность (полезная нагрузка) {вернуться payload.siteAdded }, подписаться () {вернуться pubsub.asyncIterator ( 'siteAdded');}} * / // тест withFilter siteAdded: {Тип: SiteType, арг: {имя: {Тип: GraphQLString}}, решительность (полезная нагрузка) {вернуться payload.siteAdded; }, Подписаться () {// это возвращает неопределенное withFilter (() => {console.log ( "в подписываться withfilter"), возвращение pubsub.asyncIterator ( 'siteAdded');}), (полезная нагрузка, переменные) => { console.log ( "полезная нагрузка, переменные", полезная нагрузка, переменные); возвращает истину; }}}})}); module.exports = подписки; Я использую graphiql для запуска запросов, // это используется для добавления сайта мутации {AddSite (название: «название теста», место нахождения: «где-то»
aqmattil
1

голосов
1

ответ
381

Просмотры

Подписка не соединяется с помощью ApolloServer

Я пытаюсь получить подписку и работаю с ApolloServer (ст 2.2.2). У меня была установка, что все из-а-Внезапное просто перестал работать. При попытке подключиться к подписке в graphiql / PlaygroundI получаю ошибку: { «Ошибка»: «Не удалось подключиться к WebSocket конечных точек WS: // локальный: 4000 / graphql Пожалуйста, проверьте, если конечная точка URL является правильным.». } Поскольку у меня есть покой оконечных точки в моем приложении мне нужно иметь выразить, но я не могу получить минимальный пример из ниже бегов: импорт HTTP из «HTTP»; импорт {ApolloServer, PubSub} от 'аполлон-сервер-экспресс'; импорт экспресс от «экспресса»; Const PubSub = новый PubSub (); // Сообщения константных DB = []; Const = `определения типов типа запроса {сообщения: [String]! } Типа мутации {addMessage (сообщение: String): [String]! } Подписка Тип {NewMessage: String! } {Схема запроса: мутации запроса: Мутация подписки: Подписка} `; константные резольверы = {Запрос: {сообщения () {возвращать сообщения; }}, Мутация: {addMessage (корень, {сообщение}) {пусть запись = JSON.stringify ({ID: messages.length, сообщение: сообщение}); messages.push (вход); pubsub.publish ( 'NewMessage', {запись: запись}); возвращать сообщения; }}, Подписка: {NewMessage: {Решимость: (сообщение) => {возвращение message.entry; }, Подписаться: () => pubsub.asyncIterator ( 'NewMessage'),},},}; Const приложение = экспресс (); Const ПОРТ = 4000; Const сервер = новые ApolloServer ({, резольверы определения типов, подписки: {OnConnect: () => console.log ( 'Подключение к WebSocket'),}}); сервер. applyMiddleware ({приложение}) = Const HTTPServer http.createServer (приложение); server.installSubscriptionHandlers (HTTPServer); httpServer.listen (PORT, () => {console.log ( `🚀 сервер готов по адресу: // локальный: $ {PORT} $ {server.graphqlPath}`) console.log ( `🚀 Подписки готовы на веб-службой: / / локальный: $ {PORT} $ {server.subscriptionsPath} `)}) другие конечные точки работают нормально, но она не в состоянии создать WebSocket. Насколько я понимаю, я не должен использовать другой сервер или порт (см https://www.ably.io/concepts/websockets). Я возился с SubsciptionServer, но это должно быть обработано installSubscriptionHandlers (вот код). журнал ( `🚀 Подписки готовы на WS: // локальный: $ {PORT} $ {server.subscriptionsPath}`)}) Другие конечные точки работают нормально, но она не в состоянии создать WebSocket. Насколько я понимаю, я не должен использовать другой сервер или порт (см https://www.ably.io/concepts/websockets). Я возился с SubsciptionServer, но это должно быть обработано installSubscriptionHandlers (вот код). журнал ( `🚀 Подписки готовы на WS: // локальный: $ {PORT} $ {server.subscriptionsPath}`)}) Другие конечные точки работают нормально, но она не в состоянии создать WebSocket. Насколько я понимаю, я не должен использовать другой сервер или порт (см https://www.ably.io/concepts/websockets). Я возился с SubsciptionServer, но это должно быть обработано installSubscriptionHandlers (вот код).
Max Gordon
1

голосов
1

ответ
70

Просмотры

apolloClient.subsribe не определен

Я пытаюсь подписаться Аполлону, и я получаю следующее сообщение об ошибке apolloClient.Subsribe неопределен Прикрепление мой стороне клиента подписки константный NetworkInterface = createNetworkInterface ( «HTTP: // локальный: 8000 / graphql»); Const wsClient = новый SubscriptionClient ( `WS: // Localhost: 8000 /`, {повторно подключиться: правда, connectionParams: {}}); константное networkInterfaceWithSubscriptions = addGraphQLSubscriptions (NetworkInterface, wsClient); Const apolloClient = новый ApolloClient ({NetworkInterface: networkInterfaceWithSubscriptions})
Sai Ram
1

голосов
1

ответ
158

Просмотры

GraphQL/Prisma Subscriptions only fire for DELETE

I have set up a project using Prisma for handling the communication/storage/retrieval of data to and from the server. It is essentially the same architecture as here example. The only major difference is that my resolvers aren't separated into different files they are all resident in the index.js. Now, I am trying to implement subscriptions which will catch all changes to my models. But for the life of me I cannot get the subscription to fire for anything other than DELETE actions. I have read multiple forum posts and examples but still the problem persists. My index.js Subscription resolvers look as below: Subscription: { userChanges: { subscribe: (_, args, context, info) => { console.log("CHECKCHECK"); return context.prisma.subscription.user( { where: { mutation_in: ['CREATED'] } }, info ) } }, taskChanges: { subscribe: async (_, args, context, info) => { return await context.prisma.subscription.task({}, info) } } } My schema.graphql looks like this: # import Task, User from '../generated/prisma.graphql' # import TaskSubscriptionPayload, UserSubscriptionPayload from '../generated/prisma.graphql' type Query { task(id: ID!): Task tasks: [Task]! user(id: ID!): User users: [User!] getUserTasks(id:ID!): [Task]! } type Mutation { addTask( name: String!, priority: Float!, weight: Int!, best: Float!, expected: Float!, worst: Float!, calculated: Float!, stdDev: Float!, actualTime: Float, tags: [String!]!, ownedBy: ID! ): Task! updateTask( id: ID!, name: String!, priority: Float!, weight: Int!, best: Float!, expected: Float!, worst: Float!, calculated: Float!, stdDev: Float!, actualTime: Float, tags: [String!]!, ownedBy: ID! ): Task! deleteTask(id: ID!): Task! addNewUser(name: String!): User! deleteUser(id:ID!): User! } type Subscription { taskChanges: TaskSubscriptionPayload userChanges: UserSubscriptionPayload } I must be missing something because any/all issues I find on the Prisma forums were resolved by fixes way back in March. I suspect it may be something to do with an Async prisma binding but that is just intuition. Any help would be much appreciated. Thanks, A
A.Smith
0

голосов
0

ответ
6

Просмотры

Глядя на код для серверной стороны GraphQL подписки слушателя

Я искал высоко и низко для некоторого кода, который позволит мне зарегистрироваться на подписку GraphQL на стороне сервера и читать сообщения, исходя из внешнего сервера подписки на стороне сервера. Я могу получить подписку на клиент на сторону сервера для подключения к внешней подписке серверу, но я после получения исходного сообщения нуля при соединении, как так {сообщение: «Из умолчанию Listener», данные: {данные: {eventAdded: NULL}}} сообщения не захватываются там после. Помогите, пожалуйста? Вот мой код, константные Ws = требуется ( 'WS'); константный {ApolloClient} = требуется ( 'APOLLO-клиент'); Const {SubscriptionClient} = требуется ( 'подписки-транспортный-WS'); константный {createHttpLink} = требуется ( 'аполлон-канальный HTTP'); Const {InMemoryCache} = требуется ( 'аполлон-кэш-InMemory'); Const выборки = требуется (» Узел-выборки '); Const GQL = требуется ( 'graphql-тег'); Const SERVERCONFIG = {ServerURL: 'HTTP: // локальный: 4000 /', subscriptionUrl: 'WS: // локальный: 4000 / graphql'}; Const ПОРТ = process.env.PORT || 4001; пусть Аполлон; пусть NetworkInterface; Const ссылка = createHttpLink ({URI: serverConfig.serverUrl, выборки: выборка}); NetworkInterface = новый SubscriptionClient (serverConfig.subscriptionUrl, {повторно: истинно}, WS); аполлон = новый ApolloClient ({NetworkInterface, ссылка: ссылка, кэш: новый InMemoryCache ()}); Const клиент = () => аполлон; Const субклиент = клиент (); subClient.subscribe ({запрос: gql` подписки eventAdded {eventAdded {идентификатор имя полезной нагрузки createdAt storedAt}} `, . переменные: {}}) подписаться ({следующий: (данные) => {console.log ({сообщение: 'Из умолчанию Listener', данные});}, ошибка: (ERR) => {console.log (ERR ); сделано (ERR);}}); Если выяснится, что я сделал что-то действительно тупой, пожалуйста, простите меня. Любая помощь будет очень ценна.
reselbob
1

голосов
1

ответ
0

Просмотры

Как изменить WebSocket URL в graphql-игровой площадки (подписка)

Я хотел бы изменить graphql конечную точку внутри WebSocket graphql, кто знает, как это сделать? по умолчанию он свистит WSS: // локальный / graphql Мне нужно изменить его на толкатель URL-адрес спасибо :-)
Jagadesha NH
1

голосов
1

ответ
315

Просмотры

Apollo GraphQL подписка ответ не обрабатывает вложенные запросы

У меня есть следующая подписка GraphQL работает отлично: подписка voucherSent ($ estId: Int) {voucherSent (estId: $ estId) {имя идентификатор usedAt sentAt}} Но следующее посылает «Не удается прочитать свойство„User“неопределенных» ошибки подписка на voucherSent ($ estId: Int) {voucherSent (estId: $ estId) {имя идентификатор usedAt sentAt владелец {имя пользователя идентификатор}}} обрабатывать ли Apollo GraphQL подписка на вложенные запросы? Вот мой распознаватель код: возвращение models.Voucher.update ({sentAt:. Момент () формат (), usedIn: args.sentTo,}, {где: {ID: args.id}}) .then (соответственно => (models.Voucher.findOne ({где: {ID: args.id}}) .then ((ваучер) => {pubsub.publish (VOUCHER_SENT, {voucherSent: ваучер, estId: voucher.usedIn}); возвращать соотв;
Thierry D.
1

голосов
2

ответ
559

Просмотры

Подписка компонент с клиентом GraphQL Apollo

У меня есть приложение с одной подписки уже используют subscribeToMore Query компонент: {({данных, subscribeToMore}) => {обратный (); }} Этот запрос загружает список сообщений, где, насколько я знаю, что мы придаем подписчик в ComponentDidMount так всякий раз, когда я добавить новый элемент в мой список внутри запроса, моя подписка будет слушать подписки и делать все, что я хочу (в в этом случае добавить новое сообщение в мой текущий список сообщений). Список Messages компонента: экспорт класса по умолчанию MessageList расширяет React.Component {componentDidMount () {this.props.subscribeToMore ({документ: MESSAGE_CREATED, updateQuery: (пред {subscriptionData}) => {если (subscriptionData.data) возвращение пред , возвращение {Allmessages: [subscriptionData.data.messageCreated, ... пред. Allmessages],}; }}); } Визуализации () {возвращение ({this.props.messages.map (сообщение => ())}); }} Я хотел бы добавить еще одну подписку, так что если я изменить мое сообщение информация обновляется в режиме реального времени. Для того, чтобы достичь этого я создал следующий компонент с помощью компонента Подписки Message (где я хотел бы добавить еще одну подписки на основе обновленного сообщения) Класс экспорта по умолчанию MessageElement расширяющего компонента {componentDidMount () {this.messageUpdatedSubscription (); } MessageUpdatedSubscription = () => ({({данные: {messageUpdated}}) => (console.log ( 'Do smthg ???', messageUpdated))}); Render () {возвращение ({updateMessage => ({this.props.message. текст} {updateMessage ({переменные: {ID: this.props.message.id, текст: this.props.message.text, isFavorite: this.props.message.isFavorite}}); }} />)}); }} Мои подписки на сервере работают, как у меня уже есть подписка на MESSAGE_CREATED на Query работает правильно, и я проверил, что на сервере моя подписка на MESSAGE_UPDATED срабатывает. Тем не менее, я не могу понять, почему пользовательский интерфейс не отображается или console.log ничего, как будто он не слушает подписку. Могу ли я добиться этого с подписного компонентом или с subscribeToMore? заранее спасибо Могу ли я добиться этого с подписного компонентом или с subscribeToMore? заранее спасибо
itReverie
1

голосов
1

ответ
54

Просмотры

аргументы комплексов подписки AWS AppSync

В настоящее время я работаю на приложении обмена сообщений и хочу создать глобальную подписку, чтобы продемонстрировать то, что я хочу достичь Пусть есть мутация, как SendMessage, которая содержит SenderId и член только, например, как: - мутацию SendMessage (SenderId: String !, Участники: [String]) {ответ} этой мутации используются для отправки сообщения пользователя реального примера отличается и сложный, поэтому я спрашиваю с небольшим примером позволяет запускать мутацию со следующими значениями, такими как: - мутация SendMessage (SenderId:» А», члены: [„A“,„B“,„C“]) {ответ} Мой вопрос - можно ли получить подписку только тогда, когда элементы содержат„B“в члены массива что-то вроде этого: - subscribeToSendMessage ( член: [ "Б"]): aws_subscribe сообщения (мутации: [ "SendMessage"])
dreamBegin
6

голосов
1

ответ
376

Просмотры

Реагировать Apollo первого объект от подписки не будучи сливаться в предыдущие данные, он фактически получает удален

У меня есть запрос, который получает мне список заметок и подписка, которая прослушивает и вставляет новые ноты, изменяя запрос. Однако проблема не добавляется первая нота. Итак, позвольте мне добавить больше деталей, первоначально ответ запроса с объектом, который содержит атрибут, называемого примечание, который является массивом 0 длины, если попытаться добавить примечание атрибут получает удален. В записке создаются так, если я обновить мое приложение запрос вернет купюру, то если я пытаюсь добавить примечание снова примечание добавляется в массив в объекте запроса. Вот мой отмечает контейнер, где я запрашиваю для заметок и создать новое свойство для подписки больше примечаний. экспорт Const NotesDataContainer = компонент => graphql (NotesQuery, {имя: 'отмечает', реквизит: реквизит => {console.log (реквизит); // props.notes. примечания не определен на первой ноте добавляется, когда ни один не существует. возвращающие {... реквизита, subscribeToNewNotes: () => {вернуться props.notes.subscribeToMore ({документ: NotesAddedSubscription, updateQuery: (prevRes, {subscriptionData}) => {если (subscriptionData.data.noteAdded) возвращение prevRes; обновление возврата (prevRes, {примечания: {$ unshift: [subscriptionData.data.noteAdded]}});}})}}}}) (компонент); Любая помощь будет здорово, спасибо. EDIT: экспорт Const NotesQuery = gql` NotesQuery запроса {примечания {название _id убывание поделилась}} Добавлен в избранное `; экспорт Const NotesAddedSubscription = gql` подписки onNoteAdded {noteAdded {_id название убывание}} `; Другой класс РЕДАКТИРОВАТЬ NotesPageUI расширяет Компонент {Конструктор (реквизит) {супер (реквизит); this.newNotesSubscription = NULL; } ComponentWillMount () {если (this.newNotesSubscription!) {This.newNotesSubscription = this.props.subscribeToNewNotes (); }} Визуализации () {возвращение (this.props.deleteNote (идентификатор)} favouriteNoteRequest = {this.props.favouriteNote} />)}} Другой редактирование: https://github.com/jakelacey2012/react-apollo-subscription- проблема
Jake Lacey
1

голосов
2

ответ
1.5k

Просмотры

ReactJS: TypeError: Невозможно добавить / удалить запечатанные элементы массива

Я пытаюсь использовать API, сделанный с Apollo GraphQL и обновлением реагировать компоненты в реальное время с помощью подписки GraphQL с использованием библиотеки подписок-транспортно-WS. Для выполнения операции удаления, я получаю TypeError: не могу добавить / удалить запечатанную ошибку элементов массива. Вот код из реагировать компонент, который пытается обновить данные от подписки. componentWillReceiveProps (nextProps) {если {пусть {subscribeToMore} = this.props.data this.subscription = [subscribeToMore ({документ (this.subscription && nextProps.data.loading!): postDeleted, updateQuery: (previousResult, {} subscriptionData ) => {Const delPost = subscriptionData.data.postDeleted; Const mainData = previousResult.Posts; пусть пост = mainData.find (пост => post.id == delPost.id); пусть updatedList = mainData.splice (пост, 1); вернуться updatedList; }})]}}
s develop
6

голосов
1

ответ
2.1k

Просмотры

Uncaught TypeError: Can't add property 12, object is not extensible

Я не могу понять ошибку я получаю на моем клиентском приложении. Я подписываюсь на подписку graphql, и я могу получить обновления, но я не в состоянии подтолкнуть изменения в массив машинописи называемого «моделями: ModelClass []», который связан с представлением. Есть ли что-то я отсутствую или делаю неправильно? models.component.ts this.apollo.subscribe ({запрос: gql` подписки {newModelCreated {_id имя типа train_status deploy_status data_path описание created_at updated_at}} `}). подписаться ((данные) => {console.log (" СОЗДАНО: "+ JSON.stringify (data.newModelCreated)); console.log (data.newModelCreated); вар температура: ModelClass = data.newModelCreated; this.models.push (температура);}); Модель класса. TS экспорт интерфейс ModelClass {_id: строка; Имя: строка; тип: строка; Параметры: {альфа: число; }; train_status: строка; deploy_status: строка; test_accuracy: строка; created_at: номер; updated_at: номер; }
cyberbeast
3

голосов
0

ответ
187

Просмотры

Graphql-JS тесты подписки блок не работает, как ожидалось

Я написал интеграционные тесты для graphql-JS подписок, которые показаны странное поведение. Моя подписка graphq-JS прекрасно работает в GraphiQL. Но когда та же подписка вызываются из модульного тестирования, он терпит неудачу. Ggraphql-Js объект, с функцией Resolve и подписаться функцией возврата {типа: OutputType, арг: {ввод: {типа: новый GraphQLNonNull (inputType)},}, решительность (полезная нагрузка, арг, контекст, информация) {сопз clientSubscriptionId = (полезная нагрузка )? payload.subscriptionId: нуль; константный объект = (полезная нагрузка)? payload.object: нуль; вар где = NULL; тип переменная = NULL; целевая переменная = NULL; если (объект) {где = (полезная нагрузка)? payload.object.where: нуль; тип = (полезная нагрузка)? payload.object.type: нуль; целевая = (полезная нагрузка)? payload.object.target: нуль; } Вернуть Promise.resolve (subscribeAndGetPayload (полезная нагрузка, арг, контекст, Информация о)) .then (полезная нагрузка => ({clientSubscriptionId, где, тип, цель, объект: payload.data,})); }, Подписываться: withFilter (() => pubSub.asyncIterator (ModelName), (полезная нагрузка, переменные, контекст, данные) => {сопз subscriptionPayload = {clientSubscriptionId: variables.input.clientSubscriptionId, удалить: variables.input.remove, создать : variables.input.create, обновление: variables.input.update, выбирает: variables.input.options}; subscriptionPayload.model = модель, попробуйте {pubSub.subscribe (info.fieldName, NULL, subscriptionPayload);} поймать (например, ) {console.log (ех);} возвращает истину;})}; Подписка Подписка на запрос {Клиент (ввод: {создать: правда, clientSubscriptionId: 112}) {клиент {идентификатор имя возраст}}} мутация Мутация запроса {Клиент {CustomerCreate (вход: {данные: {имя: "Atif 50", возраст: 50}}) {OBJ {имя идентификатор}}}} Интеграция Test «использовать строгий»; Ws = Const требуется ( 'WS'); Const {SubscriptionClient} = требуется ( 'подписки-транспортный-WS'); константный {ApolloClient} = требуется ( 'APOLLO-клиент'); Const {HttpLink} = требуется ( 'аполлон-канального HTTP'); Const {InMemoryCache} = требуется ( 'аполлон-кэш-InMemory'); Const Promise = требуется ( 'Bluebird'); Const ожидать = требуется ( 'Chai') ожидать. Const Chai = требуется ( 'Chai') использование (требуется ( 'Chai-клиент')). Сервер = Const требуется ( '../ сервер / сервер'); Const GQL = требуется ( 'graphql-тег'); пусть Аполлон; пусть NetworkInterface; Const GRAPHQL_ENDPOINT = 'WS: // локальный: 5000 / подписки'; описывают ( 'Подписка', () => {раньше (асинхронной () => {NetworkInterface = новый SubscriptionClient (GRAPHQL_ENDPOINT, {повторно: истинно}, WS); APOLLO = новый ApolloClient ({NetworkInterface, ссылка: новый HttpLink ({Uri : 'HTTP: // локальный: 3000 / graphql'}), кэш: новый InMemoryCache ()});}); после того, как (сделано => {networkInterface.close ();}); он ( 'подписка', асинхронная ( .) => {сопз клиент = () => аполлон; // ПОДПИСКА и сделать обещание сопзЬ subscriptionPromise = новый Promise ((решительность, отклонять) => {клиент (подписку) ({запрос: gql` подписки {Клиент (ввод: {создать: истинно, clientSubscriptionId: 112, опции: {где: {возраст: 50}}}) {клиент {имя}}}} `) подписаться ({следующий:. решить, ошибка: отвергнуть}); }); пусть execGraphQL; // мутировать ждут execGraphQL ( `мутации {Клиент {CustomerCreate (вход: {данные: {имя: "Atif 21", возраст: 50}}) {OBJ {имя идентификатор}}}}`); // ASSERT подписка ПОЛУЧЕННЫЕ EVENT ожидать (ждут subscriptionPromise) .to.deep.equal ({}); }); }); Проблема здесь, когда тест в перспективе, полезная нагрузка в функции Resolve содержит глобальные данные, где, как он должен содержать подписки полезную нагрузку. Таким образом, код ломается.
M Atif
2

голосов
1

ответ
435

Просмотры

Apollo subscription not working

I have a graphql server and I'm attempting to trigger an event whenever the status of an entity is updated. I have a mutation for updating the entity, which uses graphql-subscriptions to publish the update for the subscriber to listen to. However, pubsub.subscribe(EVENT_NAME) picked up the change, but when I integrate that into the subscription resolver, it doesn't trigger the update. I've redacted parts of the code not relevant to the issue for brevity. My resolver: Mutation: { updateStatus(_, { id, status, hash }) { return repository.updateStatus(id, status, hash); } }, Subscription: { updatedStatus: { subscribe: () => pubsub.asyncIterator('updatedStatus'), } }, My repository: export const updateStatus = async function(id: String, status: String, hash: String) { try { const res = await fetch(`${baseURL}/article/${id}/status?publish_hash=${hash}`, { headers, method: 'PATCH', body: JSON.stringify({ status }) }); const article = await fetchSingleArticle(id, 'XML', headers.channel, false); await pubsub.publish('updatedStatus', article); return article; } catch (e) { console.log(e.message); } } My schema: type Mutation { updateStatus(id: ID!, status: PublishingStatus = PUBLISHING, hash: String): Article } type Subscription { updatedStatus(id: ID!): Article } schema { query: Query mutation: Mutation subscription: Subscription } To test this, I'm just using graphiql, which is picking up the websocket connection fine. I've attempted the publish using both article (as shown) and { updatedStatus: article }, neither seem to get picked up. As mentioned previously pubsub.subscribe('updatedStatus') does pick up the change. So the issue seems to be related to the Subscription resolver. I'm going off the following docs: http://dev.apollodata.com/tools/graphql-subscriptions/setup.html#setup
Ewan Valentine
6

голосов
1

ответ
1.5k

Просмотры

AWS AppSync Авторизация

Я планирую использовать AWS AppSync перенести конечную точку graphQL в лямбда-функции, которая в настоящее время срабатывает с помощью POST через API шлюза. Я ищу в AppSync в основном из-за подписки, которые я не могу создать с помощью лямбда-функции. Мой механизм аутентификации основан на Auth0, используя беспарольный, и мой механизм авторизации на основе данных из нескольких таблиц в DynamoDB и она встроена в резольверах graphQL, как это было рекомендована Facebook и Apollo. Более того, она основана на каждой части запроса, который включает в себя проверку разрешения для вызова запроса / мутации, и после этого, различные объекты, включенные в запрос, так как соответствующие резольверы увольняют. Насколько я понимаю, это далеко от того, возможно, в AWS AppSync, как это навязывает с помощью Cognito. Может быть, какое-то заказной авторизатор, как в API шлюз может сделать работу, но это все еще остается неопределенным, так как она должна быть выполнены много раз при разрешении запроса graphQL (помните, один на вложенный объект, кроме первоначальной проверки работоспособности). Может быть, я могу сделать обходной путь относительно подписки, используя уведомления и обновления запросов, но я должен буду смотреть на это, как хорошо. Кто-нибудь еще с этой проблемой тоже? Как вы планируете, или решить ее? Любая помощь будет оценена Carlos Может быть, я могу сделать обходной путь относительно подписки, используя уведомления и обновления запросов, но я должен буду смотреть на это, как хорошо. Кто-нибудь еще с этой проблемой тоже? Как вы планируете, или решить ее? Любая помощь будет оценена Carlos Может быть, я могу сделать обходной путь относительно подписки, используя уведомления и обновления запросов, но я должен буду смотреть на это, как хорошо. Кто-нибудь еще с этой проблемой тоже? Как вы планируете, или решить ее? Любая помощь будет оценена Carlos
Carlos Delgado
2

голосов
0

ответ
461

Просмотры

Компонент не обновляется после просмотра изменений в Angular2

У меня есть два компонента (братья и сестры). Я также определил сервис, который отвечает за взаимодействие с моим апи. Однако, после того, как внести изменения в одном компоненте, я ожидаю, что изменения, чтобы отразить в моем другом компоненте, а также. Однако, по некоторым причинам, это не кажется, не происходит. Я пытаюсь выяснить ли я что-то отсутствует. Я пытаюсь вызвать функцию onCommit () в model.component.ts, который выталкивает данные через мутацию graphql. Graphql подписка вызывался на клиенте из-за изменения данных, однако dashboard.component.ts не отражает это. При обновлении вида приборной панели я могу, однако, увидеть изменения. Я делаю что-то неправильно? Model-service.service.ts импорт {Инъекционного} от '@ угловая / сердцевина'; // импорт {DEMO_MODELS} от»./mock-models'; импорт {urlsObject} от»../../config/urls'; импорт {} Наблюдаемые из 'rxjs / Rx'; // импорт {asObservable} из "./asObservable"; импорт {Subject} от 'rxjs / Subject'; импорт {BehaviorSubject} от 'rxjs / BehaviorSubject'; импорт {Http, Response, заголовки, RequestOptions} от '@ угловой / HTTP'; 'Rxjs / добавить / оператор / toPromise' импорта; импорт GQL из «graphql тега»; импорта {} Apollo от 'Аполлона-угловой'; импорт {ModelClass} от»./models/model-class'; импорт {userModelsQuery, userModelsQueryResponse, createNewModelMutation} от»./queries/userModels'; @Injectable () экспорт класса ModelService {частные _models: BehaviorSubject; конструктор (частный аполлон: Apollo) {это. loadInitialData (); this.monitorData (); this._models = новый BehaviorSubject ([]); } Получить модели () {вернуться this._models.asObservable (); } MonitorData (). {This.apollo.subscribe ({запроса: gql` подписки {getModelChanges {_id имя типа train_status deploy_status data_path описание created_at updated_at}}} `) (подписаться (данные) => {this._models.next (данные .getModelChanges);})} loadInitialData () {this.apollo.watchQuery ({запроса: userModelsQuery}) подписаться (({данные}) => {this._models.next (данные [ "getUserModels"]);}). ; } CreateNewModel (температура: любой) {this.apollo.mutate ({мутации: createNewModelMutation переменные: {Модель: Темп}}) подписаться (({данные}.) => {console.log ( 'Мутация Ответ:' + JSON.stringify (данные) ); // this.getModels (); this.loadInitialData ();}); }} Dashboard.component.ts ngOnInit () {this.apollo.watchQuery ({запроса: initStatusQuery}). Подписаться (. ({Данные}) => {this.coldStart = данные [ "getInitStatus"] cold_start;}); this.models = this.modelservice.models; this.apollo.subscribe ({запрос: gql` подписки {getModelChanges {_id имя типа train_status deploy_status data_path описание created_at updated_at}} `}). подписаться ((данные) => {console.log ( "DASHBOARD ОБНОВЛЕНИЕ"); console.log ( "СОЗДАНО:" + JSON.stringify (data.getModelChanges)); this.models = this.modelservice.models;}); models.component.ts onCommit (б: булево): пустота {this.wizardCommitBool = Ь; если (this.wizardCommitBool == TRUE) {console.log ( "ПРЕДСТАВЛЕНИЯ:" + JSON.stringify (this.temp_new_ml_model)); this.modelservice.createNewModel (this.temp_new_ml_model); }} Конструктор (частный маршрутизатор: маршрутизатор, частный modelservice: ModelService, частный маршрут: ActivatedRoute, частное расположение: Расположение, частный initService: InitService, частный reversePipe: ReversePipe, частный аполлон: Apollo) {} ngOnInit () {this.models = это .modelservice.models; } Модели = this.modelservice.models; }); models.component.ts onCommit (б: булево): пустота {this.wizardCommitBool = Ь; если (this.wizardCommitBool == TRUE) {console.log ( "ПРЕДСТАВЛЕНИЯ:" + JSON.stringify (this.temp_new_ml_model)); this.modelservice.createNewModel (this.temp_new_ml_model); }} Конструктор (частный маршрутизатор: маршрутизатор, частный modelservice: ModelService, частный маршрут: ActivatedRoute, частное расположение: Расположение, частный initService: InitService, частный reversePipe: ReversePipe, частный аполлон: Apollo) {} ngOnInit () {this.models = это .modelservice.models; } Модели = this.modelservice.models; }); models.component.ts onCommit (б: булево): пустота {this.wizardCommitBool = Ь; если (this.wizardCommitBool == TRUE) {console.log ( "ПРЕДСТАВЛЕНИЯ:" + JSON.stringify (this.temp_new_ml_model)); this.modelservice.createNewModel (this.temp_new_ml_model); }} Конструктор (частный маршрутизатор: маршрутизатор, частный modelservice: ModelService, частный маршрут: ActivatedRoute, частное расположение: Расположение, частный initService: InitService, частный reversePipe: ReversePipe, частный аполлон: Apollo) {} ngOnInit () {this.models = это .modelservice.models; } stringify (this.temp_new_ml_model)); this.modelservice.createNewModel (this.temp_new_ml_model); }} Конструктор (частный маршрутизатор: маршрутизатор, частный modelservice: ModelService, частный маршрут: ActivatedRoute, частное расположение: Расположение, частный initService: InitService, частный reversePipe: ReversePipe, частный аполлон: Apollo) {} ngOnInit () {this.models = это .modelservice.models; } stringify (this.temp_new_ml_model)); this.modelservice.createNewModel (this.temp_new_ml_model); }} Конструктор (частный маршрутизатор: маршрутизатор, частный modelservice: ModelService, частный маршрут: ActivatedRoute, частное расположение: Расположение, частный initService: InitService, частный reversePipe: ReversePipe, частный аполлон: Apollo) {} ngOnInit () {this.models = это .modelservice.models; }
cyberbeast
2

голосов
1

ответ
433

Просмотры

Пример подписки класса с помощью графена и Python

Я пытаюсь выяснить, как правильно определить подписок в моей схеме с использованием графена-питона. До сих пор я реализовал запросы и мутации, но как вы определяете класс подписки? Ниже то, что я изначально думал: класс Subscription (graphene.Subscription): имя = graphene.String () # остальные атрибуты ... Защиту подписаться (я, арг, контекст, информация): пропуск Может кто-то просьба представить небольшой пример ? Любая помощь будет принята с благодарностью! Спасибо :). Брайан
Brian
2

голосов
0

ответ
82

Просмотры

GraphQL: Adding subscription to schema

I am trying to setup subscriptions with GraphQL and Relay. I have the following mutation which adds a new team: const createTeamMutation = mutationWithClientMutationId({ name: 'CreateTeam', inputFields: { ownerId: { type: new GraphQLNonNull(GraphQLInt) }, name: { type: new GraphQLNonNull(GraphQLString) }, }, outputFields: { team: { type: teamType, resolve: (payload) => payload } }, mutateAndGetPayload: (team) => { const { ownerId, name } = team; // Using Sequalize ORM here.. return db.models.team.create(team) .then.... etc } }); This works fine but I can't seem to figure out how to get my subscriptions working at least in GraphiQL. I have the following definition in my schema: const GraphQLCreateTeamSubscription = subscriptionWithClientId({ name: 'CreateTeamSubscription', outputFields: { team: { type: teamType, resolve: (payload) => payload } }, subscribe: (input, context) => { // What is meant to go here?? }, }); I am not sure how to build out the subscribe feature and can't seem to find enough documentation. When I run the following in GraphiQL, subscription createFeedSubscription { team { id ownerId name } } I get the following error: Cannot query field team on type Subscription. Thank you for all the help!
Mary Cahill
4

голосов
2

ответ
798

Просмотры

GraphQL Подписка: Max Слушатели превышены Предупреждение

Мы используем GraphQL подписки и PubSub подписаться на сообщения. Когда более 10 подписок происходят получают предупред узла «MaxListenersExceededWarning:. Возможной утечку EventEmitter памяти обнаружена» Можно ли поднять максимум слушателей в классе PubSub? Класс PubSub находится внутри отдельного модуля и выглядит следующим образом: импорт {PubSub} из «graphql-подписки»; Const PubSub = новый PubSub (); экспорт {PubSub}; Сервер подписки выглядит следующим образом: импорт {SubscriptionManager} из «graphql-подписки»; импорт {createServer} от 'HTTP'; импорт {SubscriptionServer} из 'подписки-транспортного-WS'; импорт {PubSub} из»./subscriptions'; импорт executableSchema из './executableSchema'; Const WS_PORT = 8080; Const websocketServer = createServer ((запрос, ответ) => {response.writeHead (404); response.end ();}); websocketServer.listen (WS_PORT, () => console.log ( `WebSocket сервер теперь работает на HTTP: // LOCALHOST: $ {WS_PORT}`)); Const subscriptionManager = новый SubscriptionManager ({схема: executableSchema, PubSub: PubSub, setupFunctions: {newPost: (опционы, арг) => {{возвращение newPostChannel: {фильтр: (пост) => {вернуться args.publicationId === пост. relatedPublication.id;}}}}}}); Const subscriptionServer = новый SubscriptionServer ({subscriptionManager: subscriptionManager}, {Сервер: websocketServer, путь: '/',}); экспорт {subscriptionServer}; writeHead (404); response.end (); }); websocketServer.listen (WS_PORT, () => console.log ( `WebSocket сервер теперь работает на HTTP: // LOCALHOST: $ {WS_PORT}`)); Const subscriptionManager = новый SubscriptionManager ({схема: executableSchema, PubSub: PubSub, setupFunctions: {newPost: (опционы, арг) => {{возвращение newPostChannel: {фильтр: (пост) => {вернуться args.publicationId === пост. relatedPublication.id;}}}}}}); Const subscriptionServer = новый SubscriptionServer ({subscriptionManager: subscriptionManager}, {Сервер: websocketServer, путь: '/',}); экспорт {subscriptionServer}; writeHead (404); response.end (); }); websocketServer.listen (WS_PORT, () => console.log ( `WebSocket сервер теперь работает на HTTP: // LOCALHOST: $ {WS_PORT}`)); Const subscriptionManager = новый SubscriptionManager ({схема: executableSchema, PubSub: PubSub, setupFunctions: {newPost: (опционы, арг) => {{возвращение newPostChannel: {фильтр: (пост) => {вернуться args.publicationId === пост. relatedPublication.id;}}}}}}); Const subscriptionServer = новый SubscriptionServer ({subscriptionManager: subscriptionManager}, {Сервер: websocketServer, путь: '/',}); экспорт {subscriptionServer}; журнал ( `WebSocket сервер теперь работает на HTTP: // локальный: $ {WS_PORT}`)); Const subscriptionManager = новый SubscriptionManager ({схема: executableSchema, PubSub: PubSub, setupFunctions: {newPost: (опционы, арг) => {{возвращение newPostChannel: {фильтр: (пост) => {вернуться args.publicationId === пост. relatedPublication.id;}}}}}}); Const subscriptionServer = новый SubscriptionServer ({subscriptionManager: subscriptionManager}, {Сервер: websocketServer, путь: '/',}); экспорт {subscriptionServer}; журнал ( `WebSocket сервер теперь работает на HTTP: // локальный: $ {WS_PORT}`)); Const subscriptionManager = новый SubscriptionManager ({схема: executableSchema, PubSub: PubSub, setupFunctions: {newPost: (опционы, арг) => {{возвращение newPostChannel: {фильтр: (пост) => {вернуться args.publicationId === пост. relatedPublication.id;}}}}}}); Const subscriptionServer = новый SubscriptionServer ({subscriptionManager: subscriptionManager}, {Сервер: websocketServer, путь: '/',}); экспорт {subscriptionServer}; {{Возвращение newPostChannel: {фильтр (пост) => {возврата args.publicationId === post.relatedPublication.id; }}}; }}}); Const subscriptionServer = новый SubscriptionServer ({subscriptionManager: subscriptionManager}, {Сервер: websocketServer, путь: '/',}); экспорт {subscriptionServer}; {{Возвращение newPostChannel: {фильтр (пост) => {возврата args.publicationId === post.relatedPublication.id; }}}; }}}); Const subscriptionServer = новый SubscriptionServer ({subscriptionManager: subscriptionManager}, {Сервер: websocketServer, путь: '/',}); экспорт {subscriptionServer};
Locco0_0
4

голосов
3

ответ
1.1k

Просмотры

Serverless GraphQL Подписки

Я недавно начал работать с GraphQL и был в состоянии успешного установить его на AWS Lambda дает мне «бессерверную» архитектуру. Тем не менее, я хотел бы использовать GraphQL подписку для получения дополнительной функциональности в режиме реального времени. Я понимаю, что AWS лямбда не позволяет WebSockets, так как соединения только продолжаться до тех пор, пока функция работает или лимит времени ожидания достигается. Но есть какой-то способ, чтобы настроить GraphQL бэкенд так, что он может использовать подписки и держать его в рамках услуги AWS и он масштабироваться как приложение «бессерверной». Что-то, как с помощью AWS Lambda для GraphQL запросов и мутаций, а затем другую услугу AWS для GraphQL подписок.
Dan
2

голосов
2

ответ
589

Просмотры

Spring загрузки graphql-Java и подписки

В следующем примере https://github.com/graphql-java/graphql-java-subscription-example, использование которого graphql--х Java для подписки над WebSocket. Как же идея сделать в весенней версии? GraphQLSubscriptionResolver должна возвращать издатель, но я не могу работать, как это может быть использовано с вебом-розеткой. В приведенном выше примере кажется, хорошо в пределах ни пружинной версии.
user101010101
3

голосов
1

ответ
195

Просмотры

`Updater` не работает должным образом при использовании подписок в реле Modern

Я использую реле Modern в моем приложении и успешно интегрировался подписки с помощью функции requestSubscription. Все хорошо работает и функция обновления, которые я использую, чтобы обновить кэш получает правильно называется с соответствующей подпиской полезной нагрузкой. Подписка используется для добавления нового элемента в список Link элементов. Вот что подписка выглядит следующим образом: NewLinkSubscription.js сопзИте newLinkSubscription = graphql` подписки NewLinkSubscription {{Link мутации узел {описание идентификатора URL createdAt postedBy {имя идентификатора}}}} `экспорта по умолчанию (обновления, OnError) => {сопзЬ subscriptionConfig = { подписка: newLinkSubscription, переменные: {}, обновление, OnError} requestSubscription (окружающая среда, subscriptionConfig)} Я тогда компонент LinkList, который отрисовка всех элементов Link. В componentDidMount этого компонента, я инициировать NewLinkSubscription: LinkList.js класс LinkList расширяет компонент {componentDidMount () {NewLinkSubscription (proxyStore => {Const createLinkField = proxyStore.getRootField ( 'Ссылка') = Const NewLink createLinkField.getLinkedRecord ( 'узел' ) Const viewerProxy = proxyStore.get (this.props.viewer.id) Const соединение = ConnectionHandler.getConnection (viewerProxy, 'LinkList_allLinks'), если (соединение) {ConnectionHandler.insertEdgeAfter (соединение, NewLink)}}, ошибка => консоли. войти ( `произошла ошибка:`, ошибка),)} визуализации () {console.log ( `LinkList - оказывают`, this.props. viewer.allLinks.edges) возвращение ({this.props.viewer.allLinks.edges.map (({узел}) => {console.log ( `визуализации узла:`, узел) возврата})})}} экспорта по умолчанию createFragmentContainer (LinkList, graphql` фрагмент LinkList_viewer на средстве просмотра {ид ... Link_viewer allLinks (последний: 100, OrderBy: createdAt_DESC) @connection (ключ: "LinkList_allLinks", фильтры: []) {ребра {узел {...} Link_link }}} `) Теперь, вот что происходит, когда подписка на новый Link входит. Программа обновления называется правильно, и кажется, что новый узел получает вставляется в разъем правильно (по крайней мере ConnectionHandler.insertEdgeAfter (соединение, NewLink) является называется). Это вызывает засавить компонента. Когда я отладка визуализации для проверки данных (props.viewer.allLinks.edges), я могу видеть, что новый узел действительно был добавлен к соединению - так что список на самом деле содержит еще один товар сейчас! Однако, проблема заключается в том, что этот новый узел фактически не определен, который вызывает приложение к краху! Кто-нибудь определить, что я здесь отсутствует?
nburk
2

голосов
0

ответ
64

Просмотры

Как выполнить мутацию с гарантией, что подписка готова?

Ранее, в протоколе GraphQL было специальное сообщение, подтверждающее подписку: SUBSCRIPTION_SUCCESS (сервер -> клиент). Теперь она устарела: здесь в apollographql и здесь в prismagraphql. Почему это больше не нужно? Я подписываюсь, например подписки commentAdded {commentAdded (repoFullName: "тест") {ID}}, и я сразу же выполнить мутации, мутации submitComment {submitComment (repoFullName: "тест", commentContent: "test_msg") {содержание ID}} Как я понимаю, эти два действия выполняются асинхронно. И обработка подписки на сервере и создание источника потока событий могут занять некоторое время. Как клиент может быть уверен, что мутация активирует подписку? Или же...
don_vanchos
4

голосов
1

ответ
251

Просмотры

How to use subscriptions-transport-ws with passport and express-session

I'm using a passport local strategy that works well with express: passport.use(localStrategy); passport.serializeUser((user, done) => done(null, JSON.stringify(user))); passport.deserializeUser((obj, done) => done(null, JSON.parse(obj))); app.use(passport.initialize()); app.use(passport.session()); This localStrategy is doing a Mongoose call to get the user based on his pubKey and I guess that request.user is populated by this way. I setup my graphql endpoint like this: app.use('/graphql', bodyParser.json(), graphqlExpress(request => ({ debug: true, schema, context: { user: request.user, req: request, }, formatError: (e) => { console.log(JSON.stringify(e, null, 2)); return e; }, }))); And my subscriptions this way: const ws = createServer(app); // Run the server ws.listen(settings.APP_PORT, () => { console.log(`App listening on port ${settings.APP_PORT}!`); // Set up the WebSocket for handling GraphQL subscriptions new SubscriptionServer({ execute, subscribe, schema, onConnect: (connectionParams, webSocket) => { console.log(webSocket.upgradeReq); return { user: connectionParams }; }, }, { server: ws, path: '/subscriptions', }); }); My session is working well on graphql queries and mutations. But not with my subscriptions. My goal is to have access to my user session in my subscription resolver context. I may need to access something like request.user in onConnect to populate the context, but I don't know how to do.
Kivutar
3

голосов
1

ответ
188

Просмотры

Apollo Subscription doesn't seem to get called on Mutation

Новый Аполлону, так что я решил взять самый простой пример, который я нашел и попробовать работать его немного по-другому. Мой код можно найти здесь. Проблема, которую я имею, что Subscription, кажется, не дозвонились, когда я называю Мутация CreateTask (). Мутация и подписки определяются в schema.graphql как: Тип Мутация {CreateTask (текст: String): Задача} Подписка Тип {taskCreated: Task} И в resolvers.js как: Мутация: {CreateTask (_, {текст}) {Const задача = {ID: nextTaskId (), текст, isComplete: ложь}; tasks.push (задача); pubsub.publish ( 'taskCreated', задача); вернуть задачу; }}, Подписка: {taskCreated (задача) {console.log ( `Подстрочный называется для новой задачи ID $ {task.id}`); вернуть задачу; }}, Что я ожидал, чтобы случиться, что я хотел бы получить консоль. войти на сервер каждый раз, когда я бегу следующий в клиенте: мутация Мутация ($ Текст: String) {CreateTask (текст: $ текст) {текст ID isComplete}} Но ничего не происходит. Что мне не хватает?
CodeChimp
0

голосов
0

ответ
5

Просмотры

Не удается запустить сервер подписки в Аполлоне комплект проекта универсального сервера

Я совершенно новый в Аполлоне универсального проекта набора серверов. В универсальном проекте комплекта сервера Apollo, я добавил подписной модуль в серверных модулях. Но я не могу запустить его из GraphiQL. Я получил это subscriptionsClient.subscribe ошибка не является функцией. Даже я не знаю, как проверить, является ли подписка на сервер работает или нет.
Fatema tuz johura