Как создать преобразователь полей на 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: Я использую возраст здесь для простоты, представьте, что это дорого вычислять или получать из базы данных.
2 ответа
Это почти идентично тому, как вы это делаете с graphql-tools
.
Вы экспортируете объект с тем же именем, что и ваш тип, в свой сервис:
// services/person.js
export const Person = {
age: (_args, { root }) {
return new Date().getFullYear() - root.birthDate.getFullYear();
},
}
Кроме того, вы также можете экспортировать resolvers
в person.sdl.js
файл (но услуги имеют приоритет):
// graphql/person.sdl.js
export const schema = gql`/* ... */`
export const resolvers = {
Query: {},
Mutation: {},
Person: {},
}
Изменить: я неправильно понял вопрос, этот ответ охватывает только создание преобразователей запроса + мутации, а не преобразователя для вычисляемого поля.
Чтобы создать преобразователь полей, вам нужно решить, создаете ли вы преобразователь для запроса или обработчик для мутации.
В качестве примера можно использовать следующую схему:
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
}
`
Если указанная выше схема хранится в файле с именем persons.sdl.js
, в api/src/graphql
каталог, вы можете реализовать запросы и изменения в файле с именем persons.js
в api/src/services/persons
каталог.
// 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 }
})
}