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

#graphql #apollo-server #prisma #prisma-graphql

#graphql #apollo-сервер #prisma #prisma-graphql

Вопрос:

Я хочу знать, лучше ли или есть какая-либо разница в использовании клиента 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 не используется непосредственно в преобразователях.

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

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

Ответ №1:

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

  1. Когда вы будете писать модульные тесты, вы можете легко заменить prisma на макет реализации. Вот пример этого: 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/#asynchronous-resolvers

Комментарии:

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

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

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