无法使用Primsa在GraphQL-yoga上使用片段

时间:2018-11-22 08:51:53

标签: graphql apollo-server prisma

我正在使用带有qq和prisma-bindings的graphql-瑜伽

我正在尝试向我的解析器添加一个片段,以便在用户要求自定义字段costToDate时始终获取特定字段(在这种情况下为id)。

因此,我可以进行一些其他查询来构建该字段的结果,并且我需要该对象的ID。

不幸的是,我似乎无法使它正常工作,而且有关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)
}

我正在按照以下方式应用fragmentReplacements。

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记录fragmentReplacements对象,则会得到以下内容,因此它似乎正在拾取碎片。

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

所以我在这里的期望是,如果我对作业或要求查询costToDate字段的作业进行查询,那么它也会获取该作业/每个作业的ID。

但是,如果我进行以下查询。

query{
  jobs{
    description
    costsToDate
  }
}

但是我看不到任何id,在解析程序功能的root参数中也没有任何内容。

道歉,因为我可能在这里完全弄错了树,这似乎是一个简单的要求,但是我不能完全解决。当然,我缺少基本的东西。

谢谢!

Gareth

1 个答案:

答案 0 :(得分:0)

片段用于始终给定类型检索给定字段

它遵循以下格式:

fragment NameOfYourFragment on YourType { ... }

您当前无法始终应用有条件的片段。 此外,您在Jobs上指定了一个片段,但是Prisma使用的类型名称为Job(即使您有jobjobs解析器)

您可能只需要以下解析器:

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