Лучше передать объект prisma через контекст распознавателям или использовать его напрямую?

Я хочу знать, лучше ли или есть ли разница в использовании клиента prisma непосредственно в преобразователях или в передаче его через контекст.

В официальной документации это передается через контекст:

const { prisma } = require('./generated/prisma-client');

const resolvers = {
  Query: {
    feed: (parent, args, context) => {
      return context.prisma.posts({ where: { published: true } })
    }
}

const server = new GraphQLServer({
  typeDefs: './src/schema.graphql',
  resolvers,
  context: {
    prisma,
  },
})

Мой вопрос: почему prisma client не используется напрямую в резолверах.

const { prisma } = require('./generated/prisma-client');

const resolvers = {
  Query: {
    feed: (parent, args, context) => {
      return prisma.posts({ where: { published: true } })
    }
}

const server = new GraphQLServer({
  typeDefs: './src/schema.graphql',
  resolvers,
})

Что-то не так в этом решении?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
2
0
987
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вот несколько причин, по которым вы хотите сделать это через контекст, хотя в вашем подходе нет ничего плохого:

  1. Когда вы будете писать модульные тесты, вы можете легко заменить призму фиктивной реализацией. Вот пример этого: https://github.com/javascript-af/javascript-af/blob/1e89e5436fbf0d6e3de37f12e6853a8ff6fc7898/packages/backend/tests/utils/gqlTestClient.ts#L12

  2. Вы можете легко передать два экземпляра prisma таким образом, например, если вы хотите запросить данные в каком-то другом месте. Вы можете передать context.db1 и context.db2, создав экземпляр класса Prisma с двумя отдельными конечными точками и передав его на сервер graphql через два ключа в объекте контекста.

  3. В документации по graphql рекомендуется передавать доступ к БД через контекст. Всегда приятно следовать спецификации: https://graphql.org/learn/execution/#асинхронные-разрешители

Кроме того, вы можете создать контекст на основе запроса и, следовательно, динамически использовать экземпляр prisma или другой экземпляр в многопользовательской архитектуре (см. prisma-мультитенант)

Errorname 11.04.2019 10:15

но как заставить интенсивность работать, передавая ее через контекст.

Ahmed Eid 14.09.2019 00:27

Контекст всегда превращается в беспорядок и поощряет целый ряд антишаблонов. Со временем вы получите столько мусора, как «существует ли эта переменная в объекте контекста?», И детали реализации просачиваются повсюду. Я только начинаю работать с графиком/призмой, но мне бы очень хотелось найти лучший способ...

DanG 22.02.2020 00:43

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

Другие вопросы по теме