Как создать распознаватель полей на RedwoodJS - PullRequest
3 голосов
/ 22 марта 2020

Redwood JS автоматически сопоставляет средства разрешения запросов 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 ]

3 голосов
/ 23 марта 2020

Это почти идентично тому, как вы это делаете с 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: {},
}
0 голосов
/ 23 марта 2020

Редактировать: Я неправильно понял вопрос, этот ответ охватывает только создание преобразователей запроса + мутации, а не преобразователя для вычисляемого поля.

Чтобы создать преобразователь поля, вам потребуется чтобы решить, создаете ли вы преобразователь для запроса или обработчик для мутации.

Мы можем использовать следующую схему в качестве примера:

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 }
  })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...