在我的查询中,我可以使用参数的结果来获取该查询中的更多信息吗?

时间:2018-01-28 03:12:36

标签: graphql graphql-js

请原谅我措辞严厉的问题,但是这里有一些代码可以解释我尝试做的事情(slugvalue在此查询之外提供):

const query = `{
  post(slug: "${slug}") {
    content
    createdAt
    id <--- I want this id for my reply query
    slug
  }

  reply(replyTo: "id") { <--- The second query in question
    content
    createdAt
    id
    slug
  }

  user(id: "${value}") {
    username
  }
}`;

只是开始使用GraphQL,我喜欢这样一个事实,即我可以一次查询多个数据库。如果我还可以执行一些&#34; queryception&#34;那就太棒了。但我不确定这是否可能。

1 个答案:

答案 0 :(得分:4)

在考虑GraphQL时,记住给定类型的每个字段都由GraphQL 同时解析非常重要。

例如,当您的post查询返回Post类型时,GraphQL会同时解析contentcreatedAt字段。一旦这些字段得到解决,它就会转移到下一个&#34;级别&#34;查询(例如,如果content返回一个类型而不是标量,它将尝试解析这些字段。

您的每个查询(postreplyuser)实际上都是根查询类型的字段,同样的逻辑也适用于它们。这意味着无法在post内引用reply返回的ID - 两个查询都会同时被解雇。

上述例外以突变的形式存在,实际上是顺序解决而不是同时解决。这意味着,即使您仍然无法在post查询中使用reply作为变量的结果,您也可以使用上下文传递如果两者都是突变,则从一个到另一个。然而,这非常hackish,并要求客户以特定顺序请求突变。

更可行的解决方案是在客户端简单地处理这个问题,方法是将其分解为两个请求,并等待第二个请求启动,直到第一个返回。

最后,您可以考虑重新设计架构,以防止首先出现多个查询。例如,您的帖子类型可能只有一个replies字段,该字段可以解析与返回的帖子ID相对应的所有回复。