如何在 RedwoodJS 上创建字段解析器
How to create field resolver on RedwoodJS
RedwoodJS 自动将 GraphQL 查询解析器映射到 api/src/services
。如何为给定的 GraphQL 类型创建字段解析器?
假设我有这个模式:
type Person {
name: string!
birthDate: DateTime!
age: Int!
}
但只有name
和birthDate
存储在数据库中。
使用 graphql-tools
我会这样写我的解析器:
const resolvers = {
Query: { ... },
Mutation: { ... },
Person: {
age(person) {
return new Date().getFullYear() - person.birthDate.getFullYear();
},
},
};
PS: 我知道年龄公式是错误的
PS2:为了简单起见,我在这里使用年龄,想象一下计算或从数据库中获取它的成本很高。
编辑:我误解了这个问题,这个答案只涉及创建查询+变异解析器,而不是计算字段的解析器。
要创建字段解析器,您需要决定是为查询创建解析器,还是为突变创建处理程序。
我们可以使用以下架构作为示例:
export const schema = gql`
type Person {
id: String!
name: String!
age: Int!
}
type PersonInput {
name: String
age: Int
}
type Mutation {
createPerson(input: PersonInput!): Person
}
type Query {
people: [Person]
person(id: String!): Person
}
`
如果上述模式存储在 api/src/graphql
目录中名为 persons.sdl.js
的文件中,您可以在 api/src/graphql
目录中名为 persons.js
的文件中实现查询和变更15=]目录。
// implements Mutation.createPerson(...)
export const createPerson({ input }) => {
return db.person.create({
data: input
})
}
// implements Query.people
export const people = () => {
return db.person.findMany()
}
// implements Query.person(...)
export const person = ({ id }) => {
return db.person.findOne({
where: { id }
})
}
这与您使用 graphql-tools
的方式几乎相同。
您在服务中导出了一个与您的类型同名的对象:
// services/person.js
export const Person = {
age: (_args, { root }) {
return new Date().getFullYear() - root.birthDate.getFullYear();
},
}
顺便说一句,您还可以在 person.sdl.js
文件中导出 resolvers
(但服务优先):
// graphql/person.sdl.js
export const schema = gql`/* ... */`
export const resolvers = {
Query: {},
Mutation: {},
Person: {},
}
RedwoodJS 自动将 GraphQL 查询解析器映射到 api/src/services
。如何为给定的 GraphQL 类型创建字段解析器?
假设我有这个模式:
type Person {
name: string!
birthDate: DateTime!
age: Int!
}
但只有name
和birthDate
存储在数据库中。
使用 graphql-tools
我会这样写我的解析器:
const resolvers = {
Query: { ... },
Mutation: { ... },
Person: {
age(person) {
return new Date().getFullYear() - person.birthDate.getFullYear();
},
},
};
PS: 我知道年龄公式是错误的
PS2:为了简单起见,我在这里使用年龄,想象一下计算或从数据库中获取它的成本很高。
编辑:我误解了这个问题,这个答案只涉及创建查询+变异解析器,而不是计算字段的解析器。
要创建字段解析器,您需要决定是为查询创建解析器,还是为突变创建处理程序。
我们可以使用以下架构作为示例:
export const schema = gql`
type Person {
id: String!
name: String!
age: Int!
}
type PersonInput {
name: String
age: Int
}
type Mutation {
createPerson(input: PersonInput!): Person
}
type Query {
people: [Person]
person(id: String!): Person
}
`
如果上述模式存储在 api/src/graphql
目录中名为 persons.sdl.js
的文件中,您可以在 api/src/graphql
目录中名为 persons.js
的文件中实现查询和变更15=]目录。
// implements Mutation.createPerson(...)
export const createPerson({ input }) => {
return db.person.create({
data: input
})
}
// implements Query.people
export const people = () => {
return db.person.findMany()
}
// implements Query.person(...)
export const person = ({ id }) => {
return db.person.findOne({
where: { id }
})
}
这与您使用 graphql-tools
的方式几乎相同。
您在服务中导出了一个与您的类型同名的对象:
// services/person.js
export const Person = {
age: (_args, { root }) {
return new Date().getFullYear() - root.birthDate.getFullYear();
},
}
顺便说一句,您还可以在 person.sdl.js
文件中导出 resolvers
(但服务优先):
// graphql/person.sdl.js
export const schema = gql`/* ... */`
export const resolvers = {
Query: {},
Mutation: {},
Person: {},
}