无法在带有 Prisma 的 GraphQL-yoga 中使用 Fragments
Unable to use Fragments on GraphQL-yoga with Primsa
我正在使用带有 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
})
})
})
如果我 console.log fragmentReplacements 对象我得到以下内容,所以它似乎确实在拾取碎片。
[ { field: 'job', fragment: 'fragment costsToDate on Job { id }' },
{ field: 'jobs',
fragment: 'fragment costsToDate on Jobs { id }' } ]
所以我的期望是,如果我对作业或作业进行查询,要求提供 costsToDate 字段,它也会获取 job/each 作业的 ID。
但是,如果我进行以下查询。
query{
jobs{
description
costsToDate
}
}
但我没有看到任何 ID 提取,解析器函数的根参数中也没有任何内容。
抱歉,我可能在这里完全找错了树,这似乎是一个有点简单的要求,但我无法完全解决。当然我遗漏了一些基本的东西。
谢谢!
加雷思
片段用于总是在给定类型上检索给定字段。
它遵循以下格式:
fragment NameOfYourFragment on YourType { ... }
您目前无法有条件地应用给定片段,因为它始终会应用。
此外,您在 Jobs
上指定了一个片段,但 Prisma 使用的类型名称是 Job
(即使您有 job
和 jobs
解析器)
您可能只需要以下解析器:
const job = {
fragment: `fragment JobId on Job { id }`,
resolve: jobsResolver
}
我正在使用带有 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
})
})
})
如果我 console.log fragmentReplacements 对象我得到以下内容,所以它似乎确实在拾取碎片。
[ { field: 'job', fragment: 'fragment costsToDate on Job { id }' },
{ field: 'jobs',
fragment: 'fragment costsToDate on Jobs { id }' } ]
所以我的期望是,如果我对作业或作业进行查询,要求提供 costsToDate 字段,它也会获取 job/each 作业的 ID。
但是,如果我进行以下查询。
query{
jobs{
description
costsToDate
}
}
但我没有看到任何 ID 提取,解析器函数的根参数中也没有任何内容。
抱歉,我可能在这里完全找错了树,这似乎是一个有点简单的要求,但我无法完全解决。当然我遗漏了一些基本的东西。
谢谢!
加雷思
片段用于总是在给定类型上检索给定字段。
它遵循以下格式:
fragment NameOfYourFragment on YourType { ... }
您目前无法有条件地应用给定片段,因为它始终会应用。
此外,您在 Jobs
上指定了一个片段,但 Prisma 使用的类型名称是 Job
(即使您有 job
和 jobs
解析器)
您可能只需要以下解析器:
const job = {
fragment: `fragment JobId on Job { id }`,
resolve: jobsResolver
}