как вернуть настраиваемые данные в подписке prisma

Я изучаю graphql и prisma и столкнулся с вопросом о подписке на prisma.

Я хочу возвращать список элементов при каждом создании или обновлении элемента. Итак, это мой код, который не работает.

схема.graphql

# import Item from "./generated/prisma.graphql"

type Subscription {
    todoItems: TodoItems
}

type TodoItems {
    items: [Item!]!
}

резольвер

const Subscription = {
    todoItems: {
        subscribe: async (parent, args, context, info) => {
            const itemSubscription = await context.db.subscription.item({
                where: { mutation_in: ['CREATED', 'UPDATED'] },
            }, info);

            return itemSubscription;
        },
        resolve: async (payload, args, context, info) => {
            const items = await context.db.query.items({ type: 0, orderBy: 'updatedAt_DESC' }, info);
            return { items };
        },
    },
}

module.exports = {
    Subscription,
}

и на игровой площадке graphql,

subscription{
  todoItems{
    items{
      title
    }
  }
}

это дает ошибку:

{
  "errors": [
    {
      "message": "Anonymous Subscription must select only one top level field.",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "todoItems"
      ],
      "extensions": {
        "code": "INTERNAL_SERVER_ERROR",
        "exception": {
          "stacktrace": [
            "Error: Anonymous Subscription must select only one top level field.",
            "    at asErrorInstance (d:\\git\\inote\\node_modules\\graphql\\execution\\execute.js:489:43)",
            "    at <anonymous>",
            "    at process._tickCallback (internal/process/next_tick.js:118:7)"
          ]
        }
      }
    }
  ]
}

Есть идеи?


person 39ecneret    schedule 19.11.2018    source источник


Ответы (1)


Prisma не поддерживает подписку на списки элементов. Вместо этого prisma хочет, чтобы вы подписались на мутации отдельных элементов («создано», «обновлено», «удалено»). Как описано здесь.

E.g.

subscription newTodos {
  todo(where: {
    mutation_in: [CREATED]
  }) {
    mutation
    node {
      title
    }
  }
}

Чтобы получить «полный список», вы должны запросить todos после подписки, чтобы избежать пропуска событий (состояние гонки). В результате вам придется вручную «синхронизировать» данные из подписки и вашего запроса.

person lipp    schedule 19.11.2018
comment
Спасибо за ответ! Я просто хочу поделиться этим как подробное введение в реализацию подписок с помощью Prisma. - person nburk; 19.11.2018