代码之家  ›  专栏  ›  技术社区  ›  Jimmy C

在GraphQL中,是否可以在对象类型级别上使用解析器?

  •  2
  • Jimmy C  · 技术社区  · 6 年前

    我们正在处理一个相当复杂的GraphQL模式,其中有几个属于各种微服务的对象类型,每个对象类型都有一个我们可以查询的自然API端点。因此,如果可以直接为某些对象类型定义特定的解析器,则非常方便,方法如下:

    const typeDefs = gql`
        type Query {
          getBook(bookId: ID!): BookPayload
        }
    
        type BookPayload {
            book: Book
            userErrors: UserError
        }
    
        type Book {
          id: ID!
          title: String
          author: String
        }
    `;
    
    const resolvers = {
        Query: {
            getBook: (parent, args, context, info) => {
                return {
                    book: { id: args.bookId }
            }
        },
        Book: (parent) => {  // this object type level resolver doesn't seem to work
            return {
                id: parent.id,
                ...fetchBookMetadata(parent.id)
            };
        }
    };
    

    1 回复  |  直到 6 年前
        1
  •  5
  •   Avius    6 年前

    是的,您应该能够使用指令执行此操作或类似操作,请检查以下内容:

    https://www.apollographql.com/docs/graphql-tools/schema-directives.html#Fetching-data-from-a-REST-API

    我会把这篇文章的引语和例子贴在这里。

    假设您定义了一个与REST相对应的对象类型 资源,并且您希望避免为

    const typeDefs = `
    directive @rest(url: String) on FIELD_DEFINITION
    
    type Query {
      people: [Person] @rest(url: "/api/v1/people")
    }`;
    
    class RestDirective extends SchemaDirectiveVisitor {
      public visitFieldDefinition(field) {
        const { url } = this.args;
        field.resolve = () => fetch(url);
      }
    }
    

    根据规范,GraphQL执行引擎运行选择集,这些选择集被分解为各个字段。将检查每个字段的值或现有解析器。

    似乎,如果您定义了一个像上面那样的指令,您不会改变这个基本行为,但是您会截取并添加一个额外的自定义步骤,以便在进一步解析之前执行。