操作参数和 GraphQL 变量有什么区别?

Dee*_*hak 5 graphql graphql-js

我正在学习 GraphQL 的过程中,偶然发现了操作参数和GraphQL 变量之间的区别。因为 IMO,两者都提供客户端将动态数据传递给突变或查询等的设施。

有人可以启发我吗?

干杯!

Dan*_*den 6

参数和变量具有完全不同的功能。

GraphQL 模式中的每个字段都可以配置为接受一个或多个参数。例如:

query FilmQuery {
  film (id: "ZmlsbXM6MQ==") {
    id
    title
  }
}
Run Code Online (Sandbox Code Playgroud)

这里该film字段接受一个名为 的参数id。参数用于更改字段解析为的值。在上面的示例中,服务器Film根据id客户端提供的值返回不同的对象。

参数接受input,它可以是标量、枚举或更复杂的输入对象类型。在这里,我们将 String 值传递"ZmlsbXM6MQ=="给参数。通过写出查询中的值,我们被称为使用文字值。

在查询中使用文字值没有任何问题,但是当传递给参数的值需要是动态的时,我们需要更多的东西——我们需要变量。

变量允许我们参数化和重用查询。这是我们的示例,使用变量重写:

query FilmQuery($myId: ID!) {
  film (id: $myId) {
    id
    title
  }
}
Run Code Online (Sandbox Code Playgroud)

变量必须首先在文档顶部定义,作为操作定义的一部分。这里我们定义了一个变量 ( $myId) 并告诉 GraphQL 它的类型是ID!。一旦定义,变量就可以在操作中的任何地方使用。当客户端实际向服务器发出请求时,文档中使用的任何变量的实际值必须与查询本身一起发送。

同样,参数仅提供一种更改请求执行方式的方法,而使用变量作为这些参数的输入使特定查询变得动态且可重用。

请注意,您可以在客户端使用字符串连接或模板文字来实现与变量类似的效果。但是,您通常应该避免这样做,因为 1) 它不必要地为客户端创建额外的工作,2) 自己序列化输入,尤其是像输入对象类型这样的复杂输入,很快就会变得复杂且容易出错。