GraphQL 可选查询参数

Pos*_*Guy 6 javascript graphql

我知道您可以将架构中的参数设置为默认值,但是是否可以limit在我的 GraphQL 架构中使参数参数完全可选?

现在似乎当我在没有指定限制的情况下点击这个时,我认为这就是我得到的原因 Int cannot represent non-integer value: undefined

const schema = buildSchema(`
  companies(limit: Int): [Company]
...)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我希望能够跳过限制,以便获得所有公司。

在 JS 中,我这样称呼它:

query: `query { 
          companies(limit: ${limit}) {
 ...
Run Code Online (Sandbox Code Playgroud)

但有时我不想指定限制。所以发生的事情是客户端正在发送crafters(limit: undefined),它可能正在尝试将其转换为 Int。我不确定如何不发送limit以及如何使整个参数可选。

(我也从客户那里读到,我应该将参数指定为变量,就像query($limit: Int) { companies(limit: $limit) {我从我的客户,从JS猜测的那样?如果是这样,我将如何将我的限制JS 变量发送到其中?

Dan*_*den 10

默认情况下,GraphQL 中的参数可以为空(即可选)。因此,如果您的类型定义如下所示:

companies(limit: Int): [Company]
Run Code Online (Sandbox Code Playgroud)

您无需做任何其他事情即可使之成为limit可选项——它已经是可选项了。如果您想使其成为limit必需的,您可以通过将 a 附加!到这样的类型来使其不可为空:

companies(limit: Int!): [Company]
Run Code Online (Sandbox Code Playgroud)

您看到的错误与limit参数的类型无关。问题在于您发送的查询(基于错误消息)如下所示:

query ($limit: Int){
  companies (limit: undefined) {
    # ...
  }
}
Run Code Online (Sandbox Code Playgroud)

这里有两个问题:一,您定义了一个变量 ($limit),您实际上从未在查询中使用过该变量(如第二个错误所示)。二,您将限制设置为undefined,这在 GraphQL 中不是有效的文字。

您应该使用变量将任何动态值传递给您的查询,而不是使用字符串插值。例如:

query ($limit: Int){
  companies (limit: $limit) {
    # ...
  }
}
Run Code Online (Sandbox Code Playgroud)

如果变量可以为空(注意我们使用了Int代替Int!),那么它可以从请求中完全省略,有效地使参数的值在服务器端未定义。目前尚不清楚您如何将请求发送到服务器,但假设您没有使用某些客户端库,您可以在此处查看文档以了解如何构建您的请求。否则,请查看库的文档以了解如何在查询中正确使用变量。