如何在 RedwoodJS 上创建字段解析器

How to create field resolver on RedwoodJS

RedwoodJS 自动将 GraphQL 查询解析器映射到 api/src/services。如何为给定的 GraphQL 类型创建字段解析器?

假设我有这个模式:

type Person {
  name: string!
  birthDate: DateTime!
  age: Int!
}

但只有namebirthDate存储在数据库中。

使用 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: {},
}