当前位置: 首页 > 知识库问答 >
问题:

GraphQL解析器问题

鄢开诚
2023-03-14

我花了相当多的时间阅读GraphQL教程,但不幸的是,它们似乎没有涵盖足够的深度,我无法理解。我真的很感谢你对这个现实世界的例子的帮助。

在示例中,查询位于解析器对象的根;我可以让它在单级查询中正常工作。但是,当我尝试解析嵌套查询时,嵌套解析程序从未被调用。让我非常困惑的是,我发现graphql网站上没有发布的每一个教程都放在一个查询对象中,并将它们的查询嵌套在下面,而不是根级别。

考虑以下模式:

type Product {
  id: String!
  retailerId: String!
  title: String!
  description: String
  price: String!
  currency: String!
}

type OrderLine {
  product: Product!
  quantity: Int!
}

type Order {
  id: String!
  retailerId: String!
  orderDate: Date!
  orderLines: [OrderLine!]!
}

type Query {
  product(id: String!): Product
  order(id: String!): Order
}

schema {
    query: Query
}

以及以下查询:

query {
    order(id: "1") {
        id
        orderLines {
            quantity
        }
    }
}

我已经尝试了实现解析器的多个版本(现在只是测试数据),似乎没有一个版本返回我执行的内容。这是我当前的解析器实现:

const resolvers = {
  OrderLine: {
    quantity: () => 1,
  },
  Order: {
    orderLines: (parent: any, args: any) => { console.log("Calling order lines"); return []; },
  },
  Query: {
    product(parent, args, ctx, other) {
      return { id: args.id.toString(), test: true };
    },
    order: ({ id }) => { console.log("Calling order 1"); return { id: id.toString(), testOrder: true, orderLines: [] }; },
  },
  order: ({ id }) => { console.log("Calling order 2"); return { id: id.toString(), testOrder: true, orderLines: [] }; },
};

在控制台中,我可以看到“调用订单2”日志消息,没有指向“调用订单行”的日志,订单行数组为空。

因此,问题分为两部分:

1) 在上面的例子中,为什么会点击“调用订单2”而不是“调用订单1”?

2) 为什么上面的操作不适用于嵌套查询顺序。订单行?

提前谢谢!

共有2个答案

薄哲
2023-03-14

如果使用构建模式生成模式,为字段提供解析器的唯一方法是通过根对象。但这更像是一种黑客行为——您实际上并没有覆盖字段的默认解析程序,因此,您基本上仅限于使用根级字段(因为您正在艰难地学习)。这就是为什么只调用Query.order函数这是一个根级字段。这里详细解释了为什么通过根(类型)传递函数会起作用。

底线是你不应该使用buildSchema。如果要使用SDL定义模式,请迁移到使用Apollo Server。

子车安和
2023-03-14

质疑

type Query {
  product(id: String!): Product
  order(id: String!): Order
  users: User
}
schema {
    query: Query
}

在解析器中

const resolvers = {
  order: ({ id }) => function
  product: ({ id }) => function
}

Graphql致力于查询解析器概念。如果要查询任何查询(示例用户),必须具有解析器(ie用户),该解析器返回的用户类型为User。Graphql查询是交互式的,区分大小写。下一步是为订单/产品查询实现解析器函数。事实上,我们还没有提到的一点是,不仅根字段,而且实际上GraphQL模式中类型上的所有字段都有解析器函数。

1)为什么在上面的例子中它击中了“呼叫订单2”而不是“呼叫订单1”?在此查询中

 query {
    order(id: "1") {
        id
        orderLines {
            quantity
        }
    }
 } 

然后它转到返回具有定义类型的订单的顺序

2) 为什么上面的操作不适用于嵌套查询顺序。订单行?

You can only use two query first order and second product only as per your schema

请检查此需求的嵌套查询文档。

 类似资料:
  • 如果我有模式: 和一个解析器: 和两个可能的查询。问题#1: 和查询#2: 是否可以优化冲突解决程序,使查询#1 readAllPosts仅从数据库中提取标题,而查询#2则同时提取标题和lotsofdata? 我查看了parent、args、context和info参数,但看不到任何指示解析器是否被调用以响应像#1或#2这样的查询的内容。

  • 我正在使用Jsoup解析短html文档,该文档包含对结果进行某些逻辑操作所需的一些自定义标记 这样地: 在这种情况下,内部内容似乎丢失了,outerHtml()方法显示如下: 但是如果“show if”标签包含一个简单的文本,比如你好,它就会像预期的那样工作。 有什么想法吗?谢谢你。

  • 我试图通过构建一个具有以下模式的服务器来熟悉Graphql: 并映射到以下数据: 在编写解析器时,我注意到很多样板代码——我必须为每个持有外键的对象成员编写概念上相同的字段解析器。 有没有办法通过ID创建类型解析器?例如,字段或查询总是由

  • 您好,我正在尝试将我的graphql查询格式化为json请求,如下所示。我想以字符串形式传递id,值为“3”,当我将其作为json请求发送时,graphql会以错误的形式拒绝。我如何解决这个问题? edit1中添加的架构:`#公开指定此标量行为的URL。指令@specifiedBy( URL: String!)on|SCALAR 架构{query:RootQueryType mutation:mu

  • 首先,根据句子的大小,解析在小的句子集上平稳运行--从200ms到1s的顺序。 我想实现什么? 我想在1-2小时内解析50L个句子。 不知怎么的,我需要把这个转换成-> 转换为多线程调用。我编写了一个多线程执行器来做这件事,它看起来像这样-> 有什么办法可以做到吗?我能回答先前提出的问题,但没有什么好处。

  • GraphQL中有几个地方需要解析,而不仅仅是中的。 后端API- -用户列表-最少信息-姓名、id 构建一个架构来执行以下查询 模式可以如下- 上述模式中的解析器需要在两个不同的地方包含/处理用户详细信息获取调用。1.用户列表-和2.。必须记住处理这种类型,其中您只有一个用户ID将其转换为实际用户。 在撰写本文时,GraphQL支持和上的。不可能为整个指定解析器-只有中的可以具有解析器。因此,如