Невозможно использовать фрагменты на GraphQL-йоге с Primsa
Я использую Graphql-йогу с Призма и Призма-Привязки
Я пытаюсь добавить фрагмент в свой преобразователь так, чтобы определенное поле (идентификатор в этой ситуации) всегда выбиралось, когда пользователь запрашивает настраиваемое поле costToDate.
Это так, я могу сделать несколько дополнительных запросов, необходимых для построения результата для этого поля, и мне нужен идентификатор объекта для этого.
К сожалению, я не могу заставить его работать, и в документации, похоже, немного не хватает специфики с GraphQl-Yoga и Prisma.
Вот определение типа:
type Job {
id: ID!
projectNumber: String!
client: Client!
name: String!
description: String
quoteNumber: String
workshopDaysQuoted: String!
quoted: String!
targetSpend: String!
costs: [JobCost!]!
estimatedCompletion: DateTime
completed: Boolean!
costTotal: String
workshopDaysUsed: String
costsToDate: String
}
И вот решатель для запроса:
const jobs = {
fragment: `fragment description on Jobs { id }`,
resolve: jobsResolver
}
async function jobsResolver(root, args, context, info) {
await validatePermission(args,context,info,['admin','user','appAuth'])
const {showCompleted} = args
const completedFilter = (typeof showCompleted === 'boolean') ? { completed: showCompleted } : {}
const jobIDS = await context.db.query.jobs({ where: completedFilter }, `{ id }`)
//console.log(jobIDS);
let jobs = await context.db.query.jobs({
where: completedFilter
}, info)
return await getAllJobCostsToDateList(jobs)
}
Я применяю фрагмент Replacements, как показано ниже.
const fragmentReplacements = extractFragmentReplacements(resolvers)
console.log(fragmentReplacements)
const port = process.env.PORT || 3010
const graphQLServer = new GraphQLServer({
typeDefs: './src/schema.graphql',
resolvers,
resolverValidationOptions: {
requireResolversForResolveType: false
},
context: req => ({
...req,
db: new Prisma({
typeDefs: `src/generated/prisma.graphql`,
fragmentReplacements,
endpoint: PRISMA_ENDPOINT,
secret: PRISMA_KEY,
debug: false
})
})
})
Если я console.log, объект fragReplacements, я получаю следующее, так что, похоже, он собирает фрагменты.
[ { field: 'job', fragment: 'fragment costsToDate on Job { id }' },
{ field: 'jobs',
fragment: 'fragment costsToDate on Jobs { id }' } ]
Поэтому я ожидаю, что если я сделаю запрос к заданию или заданию, которое запрашивает поле costToDate, он также получит идентификатор задания / каждого задания.
Однако, если я сделаю следующий запрос.
query{
jobs{
description
costsToDate
}
}
Но я не вижу никакого извлеченного идентификатора и ничего в корневом параметре функции резолвера.
Извинения, поскольку я, вероятно, лаю здесь не на том дереве, кажется довольно простым требованием, но я не могу его решить. Конечно, я упускаю что-то фундаментальное.
Спасибо!
Gareth
1 ответ
Фрагмент используется, чтобы всегда получать заданные поля для данного типа.
Следует следующий формат:
fragment NameOfYourFragment on YourType { ... }
В настоящее время вы не можете применить данный фрагмент условно, так как он всегда применяется. Кроме того, вы указали фрагмент на Jobs
, но имя типа, используемого Prisma, Job
(даже если у вас есть job
а также jobs
резольверы)
Вероятно, вам нужен только следующий преобразователь:
const job = {
fragment: `fragment JobId on Job { id }`,
resolve: jobsResolver
}