Как создать преобразователь полей на 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 }
  })
}
Другие вопросы по тегам