无法通过 Prisma 在 GraphQL-yoga 中使用片段

Posted

技术标签:

【中文标题】无法通过 Prisma 在 GraphQL-yoga 中使用片段【英文标题】:Unable to use Fragments on GraphQL-yoga with Primsa 【发布时间】:2019-04-24 21:44:57 【问题描述】:

我正在使用带有 Prisma 和 Prisma-Bindings 的 graphql-yoga

我正在尝试向我的解析器添加一个片段,以便在用户请求自定义字段 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
        )
    )
)

如果我控制台记录 fragmentReplacements 对象,我会得到以下信息,所以它似乎确实在拾取碎片。

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

所以我的期望是,如果我对要求 costToDate 字段的作业或作业进行查询,它还将获取作业/每个作业的 id。

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

query
  jobs
    description
    costsToDate
  

但是我没有看到 id 被获取,并且解析器函数的根参数中没有任何内容。

抱歉,因为我可能在这里完全错误地吠叫了树,这似乎是一个有点简单的要求,但我无法完全解决。当然我错过了一些基本的东西。

谢谢!

加雷斯

【问题讨论】:

【参考方案1】:

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

它遵循以下格式:

fragment NameOfYourFragment on YourType  ... 

您目前不能有条件地应用给定的片段,因为它总是被应用。 此外,您在 Jobs 上指定了一个片段,但 Prisma 使用的类型名称是 Job(即使您有 jobjobs 解析器)

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

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

【讨论】:

以上是关于无法通过 Prisma 在 GraphQL-yoga 中使用片段的主要内容,如果未能解决你的问题,请参考以下文章

使用 Prisma 通过关联表查询多对多关系

Docker 中的 NestJS 无法在另一个 Docker 容器中的 Postgres 上执行 Prisma Migrate

Prisma-docker 无法连接到服务器

prisma.yml 无法找到

无法在 Prisma 中创建多个连接查询?

无法生成 Prisma 客户端,outputDir.endsWith 不是函数