Я хочу знать, лучше ли или есть ли разница в использовании клиента 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,
})
Что-то не так в этом решении?


Вот несколько причин, по которым вы хотите сделать это через контекст, хотя в вашем подходе нет ничего плохого:
Когда вы будете писать модульные тесты, вы можете легко заменить призму фиктивной реализацией. Вот пример этого: https://github.com/javascript-af/javascript-af/blob/1e89e5436fbf0d6e3de37f12e6853a8ff6fc7898/packages/backend/tests/utils/gqlTestClient.ts#L12
Вы можете легко передать два экземпляра prisma таким образом, например, если вы хотите запросить данные в каком-то другом месте. Вы можете передать context.db1 и context.db2, создав экземпляр класса Prisma с двумя отдельными конечными точками и передав его на сервер graphql через два ключа в объекте контекста.
В документации по graphql рекомендуется передавать доступ к БД через контекст. Всегда приятно следовать спецификации: https://graphql.org/learn/execution/#асинхронные-разрешители
но как заставить интенсивность работать, передавая ее через контекст.
Контекст всегда превращается в беспорядок и поощряет целый ряд антишаблонов. Со временем вы получите столько мусора, как «существует ли эта переменная в объекте контекста?», И детали реализации просачиваются повсюду. Я только начинаю работать с графиком/призмой, но мне бы очень хотелось найти лучший способ...
Вы не хотите, чтобы распознаватель имел доступ к вашей полной схеме, это ненужный риск.
Кроме того, вы можете создать контекст на основе запроса и, следовательно, динамически использовать экземпляр prisma или другой экземпляр в многопользовательской архитектуре (см. prisma-мультитенант)