Невозможно использовать фрагменты на GraphQL-йоге с Primsa - PullRequest
0 голосов
/ 22 ноября 2018

Я использую graphql-yoga с Prisma и Prisma-Bindings

Я пытаюсь добавить фрагмент в свой преобразователь так, чтобы определенное поле (идентификатор в этой ситуации) всегда выбиралось, когда пользователь спрашиваетдля настраиваемого поля 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, объект фрагментаReplacements, я получаю следующее,так что, похоже, он собирает фрагменты.

[ { field: 'job', fragment: 'fragment costsToDate on Job { id }' },
  { field: 'jobs',
    fragment: 'fragment costsToDate on Jobs { id }' } ]

Итак, я ожидаю, что если я сделаю запрос к заданию или заданию, запрашивающему поле costToDate, он также получитИдентификатор задания / каждого задания.

Однако, если я сделаю следующий запрос.

query{
  jobs{
    description
    costsToDate
  }
}

Но я не вижу ни одного идентификатора, а ничего в корневом параметре функции резолвера.

Извинения, поскольку я, вероятно, лаю здесь совсем не на том дереве, кажется довольно простым требованием, но я не могу его решить.Конечно, я упускаю что-то фундаментальное.

Спасибо!

Гарет

1 Ответ

0 голосов
/ 29 ноября 2018

Фрагмент используется для всегда извлечения заданных полей для заданного типа .

Он имеет следующий формат:

fragment NameOfYourFragment on YourType { ... }

В настоящее время данный фрагмент нельзя применить условно, так как он всегда применяется.Более того, вы указали фрагмент в Jobs, но имя типа, используемого Prisma, равно Job (даже если у вас есть резолверы job и jobs)

Возможно, вам нужен только следующий резолвер:

const job = {
  fragment: `fragment JobId on Job { id }`,
  resolve: jobsResolver
}
...