#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:
Вот несколько причин, по которым вы хотите сделать это через контекст, хотя в вашем подходе нет ничего плохого:
-
Когда вы будете писать модульные тесты, вы можете легко заменить prisma на макет реализации. Вот пример этого: 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/#asynchronous-resolvers
Комментарии:
1. Более того, вы можете создать контекст на основе запроса и, следовательно, динамически использовать тот или иной экземпляр prisma в многопользовательской архитектуре (см. prisma-multi-tenant )
2. но как заставить интенсивность работать при передаче его через контекст.
3. Контекст всегда превращается в беспорядок и поощряет множество антишаблонов. Со временем вы получаете так много мусора, как «существует ли эта переменная в объекте контекста?», и детали реализации просачиваются повсюду. Я только начинаю работать с graph / prisma, но мне бы очень хотелось найти лучший способ…