Подписки GraphQL / Prisma срабатывают только при УДАЛЕНИИ

Я создал проект с использованием Prisma для управления передачей / хранением / извлечением данных на сервер и с сервера. По сути, это та же архитектура, что и в примере. Единственное существенное отличие состоит в том, что мои преобразователи не разделены на разные файлы, они все находятся в index.js.

Теперь я пытаюсь реализовать подписки, которые будут улавливать все изменения в моих моделях. Но, хоть убей, я не могу заставить подписку срабатывать для чего-либо, кроме действий DELETE. Я прочитал несколько сообщений и примеров на форуме, но проблема не устранена.

Мои преобразователи подписок index.js выглядят следующим образом:

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)
        }
    }
}

Моя schema.graphql выглядит так:

# 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
}

Мне, должно быть, чего-то не хватает, потому что все проблемы, которые я нахожу на форумах Prisma, были решены исправлениями еще в марте. Я подозреваю, что это может быть связано с привязкой асинхронной призмы, но это всего лишь интуиция.

Любая помощь приветствуется.

Спасибо,

A


person A.Smith    schedule 17.08.2018    source источник
comment
Вы проверяли, активированы ли подписки на сервере Prisma? Вот как я бы начал отладку, чтобы выяснить, проблема ли это в уровне приложения (graphql-yoga и prisma-binding) или в базовой службе Prisma. Вы можете проверить это, открыв Playground для Prisma API и протестировав подписку user прямо там (вместо тестирования своих taskChanges и userChanges подписок на уровне приложения).   -  person nburk    schedule 17.08.2018
comment
Для справки вы можете рассмотреть этот пример: github.com/prisma/prisma / tree / master / examples / subscriptions Кроме того, в этом руководстве подробно рассматриваются подписки: prisma.io/docs/tutorials/build-graphql-servers/development/   -  person nburk    schedule 17.08.2018
comment
Console.log в моем преобразователе срабатывает, но только один раз, когда я впервые оформляю подписку, поэтому я знаю, что, по крайней мере, доходит до этого. Когда я тестирую его на Playground, создавая подписку на сервере App или Prisma, я получаю тот же результат, он срабатывает только для DELETE.   -  person A.Smith    schedule 17.08.2018
comment
Я также попытался реализовать свои резолверы в соответствии с примером, связанным с nburk выше. Не повезло. Все тот же результат.   -  person A.Smith    schedule 17.08.2018
comment
Значит, подписки CREATE или UPDATE также не работают в Prisma API? В этом случае, пожалуйста, откройте проблему здесь. В идеале с минимальным примером для воспроизведения проблемы (примером может быть только Prisma API с кодом уровня приложения).   -  person nburk    schedule 17.08.2018
comment
Спасибо @nburk, как только у меня будет минутка, я добавлю туда проблему. Это сводит меня с ума.   -  person A.Smith    schedule 17.08.2018


Ответы (1)


Хорошо, я исправил это после долгих проб и ошибок. Казалось бы, в начальном руководстве, которому я следовал, использовалась более старая версия изображения primsagraphql / prisma, которую необходимо обновить.

Чтобы устранить проблему, сделайте следующее:

  • Отредактируйте свой docker-compose.yml с более новой версией (для меня я обновился с 1.12 до 1.14)

    services: prisma: image: prismagraphql/prisma:1.14

  • Переведите образы докеров в автономный режим, а затем повторно разверните их. Что касается меня, я был счастлив полностью убить их, используя следующие команды, но если вы хотите сохранить свои данные, вы можете найти другой набор команд для этого.

    docker-compose kill docker-compose down docker-compose up -d

Пусть ваши недавно развернутые образы Docker немного разогреются. Моей по какой-то причине понадобилась пара секунд, чтобы проснуться: P. После этого вы должны обнаружить, что ваши подписки снова будут работать, как и ожидалось.

Надеюсь, это поможет другим, мне действительно потребовалось время, чтобы понять, что мне нужно обновить образ Docker, а не версию prisma npm.

Ваше здоровье,

A

person A.Smith    schedule 20.08.2018