【问题标题】:How to create field resolver on RedwoodJS如何在 RedwoodJS 上创建字段解析器
【发布时间】:2020-07-03 07:57:28
【问题描述】:

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:为了简单起见,我在这里使用年龄,想象一下计算或从数据库中获取它的成本很高。

【问题讨论】:

    标签: redwoodjs


    【解决方案1】:

    编辑:我误解了这个问题,这个答案只涉及创建查询+突变解析器,而不是计算字段的解析器。

    要创建字段解析器,您需要决定是为查询创建解析器,还是为突变创建处理程序。

    我们可以使用以下模式作为示例:

    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/services/persons目录下名为persons.js的文件中实现查询和突变。

    // 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 }
      })
    }
    

    【讨论】:

    • 这不能回答我关于字段解析器的问题,而不是查询或突变。我会更新这个问题,但我的意思是:假设 Person 类型有一个计算字段或一个需要对数据库进行另一个查询的关系
    • 我想知道Person.age 字段的解析器是否应该是api/src/services/persons/person.js 文件中的age 函数
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-01-15
      • 2022-01-16
      • 2019-09-28
      • 1970-01-01
      • 2011-04-18
      • 2015-11-15
      • 2018-12-02
      • 2019-02-15
      • 2021-01-01
      相关资源
      最近更新 更多