添加自定义查询和变更
你可以在 Payload 中添加自定义的 GraphQL 查询(query)和变更(mutation),充分利用 Payload 已为你定义的所有类型。
要实现这一点,请按照以下方式将你的查询和变更添加到主 Payload 配置中:
配置路径 | 描述 |
---|---|
graphQL.queries | 返回包含自定义 GraphQL 查询键值对的函数 |
graphQL.mutations | 返回包含自定义 GraphQL 变更键值对的函数 |
上述每个属性都接收一个函数,该函数定义时包含以下参数:
GraphQL
这是 Payload 的 GraphQL 依赖项。由于 GraphQL 底层工作原理的限制,你不应该自行安装 GraphQL 依赖。相反,你可以通过此参数使用 Payload 提供的副本。
payload
这是当前运行的 Payload 实例副本,它为你提供所有 Collections 和 Globals 的现有 GraphQL 类型以及其他功能。
返回值
graphQL.queries
和 graphQL.mutations
函数都应返回一个对象,其属性等于你新编写的 GraphQL 查询和变更。
示例
payload.config.js
:
import { buildConfig } from 'payload'
import myCustomQueryResolver from './graphQL/resolvers/myCustomQueryResolver'
export default buildConfig({
graphQL: {
// highlight-start
queries: (GraphQL, payload) => {
return {
MyCustomQuery: {
type: new GraphQL.GraphQLObjectType({
name: 'MyCustomQuery',
fields: {
text: {
type: GraphQL.GraphQLString,
},
someNumberField: {
type: GraphQL.GraphQLFloat,
},
},
}),
args: {
argNameHere: {
type: new GraphQL.GraphQLNonNull(GraphQLString),
},
},
resolve: myCustomQueryResolver,
},
}
},
// highlight-end
},
})
解析器函数
在你的解析器中,如果直接从 Local API 返回数据,请确保设置 depth: 0
,这样 GraphQL 才能正确解析对嵌套值(如关系数据)的查询。
你的函数将接收四个可用参数:
示例
;async (obj, args, context, info) => {}
obj
前一个对象。不常使用,通常会被丢弃。
args
查询或变更中的可用参数将在此处提供,这些参数必须首先通过自定义操作进行配置。
context
包含 req
和 res
对象的对象,将为你提供 payload
、user
实例等,就像任何其他 Payload API 处理程序一样。
info
关于当前运行的 GraphQL 操作的上下文信息。你可以从中获取模式信息以及关于此解析器函数运行位置的上下文信息。
类型
我们提供了一些类型和工具来帮助你进一步扩展 API。Payload 使用 GraphQL.js 包,你可以在官方文档中查看完整的可用类型列表。
GraphQLJSON
和 GraphQLJSONObject
import { GraphQLJSON, GraphQLJSONObject } from '@payloadcms/graphql/types'
GraphQL
你可以直接导入 Payload 使用的 GraphQL 包,这对类型定义特别有用。
import { GraphQL } from '@payloadcms/graphql/types'
对于查询(query)、变更(mutation)和处理程序(handler),请确保使用通过参数提供的 GraphQL
和 payload
实例。
buildPaginatedListType
这是一个工具函数,允许你为分页结果构建新的 GraphQL 类型,类似于 Payload 生成的 schema。 它接受两个参数:第一个是新 schema 类型的名称,第二个是用于 docs 参数的 GraphQL 类型。
示例
import { buildPaginatedListType } from '@payloadcms/graphql/types'
export const getMyPosts = (GraphQL, payload) => {
return {
args: {},
resolve: Resolver,
// 你的新类型名称必须是唯一的
type: buildPaginatedListType(
'AuthorPosts',
payload.collections['posts'].graphQL?.type,
),
}
}
payload.collections.slug.graphQL
如果你想进一步扩展提供的 API,那么 collection slug 上的 graphQL
对象包含额外的类型,可以帮助你复用类型、变更和查询的代码。
graphQL?: {
type: GraphQLObjectType
paginatedType: GraphQLObjectType
JWT: GraphQLObjectType
versionType: GraphQLObjectType
whereInputType: GraphQLInputObjectType
mutationInputType: GraphQLNonNull<any>
updateMutationInputType: GraphQLNonNull<any>
}
最佳实践
有几种方式来组织你的代码结构,我们推荐使用专门的 graphql
目录,这样你可以将所有逻辑集中在一个地方。你可以完全自由地决定如何组织这个结构,但常见的模式是按类型分组函数及其解析器。
示例
src/graphql
---- queries/
index.ts
-- myCustomQuery/
index.ts
resolver.ts
---- mutations/