【问题标题】:GraphQL optional Query ArgumentsGraphQL 可选查询参数
【发布时间】:2021-02-02 19:10:01
【问题描述】:

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

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

const schema = buildSchema(`
  companies(limit: Int): [Company]
...)

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

在 JS 中,我这样称呼它:

query: `query { 
          companies(limit: ${limit}) {
 ...

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

(我还从 client 读到过,我应该将参数指定为 variables,例如 query($limit: Int) { companies(limit: $limit) { 我猜来自我的 client ,来自 JS?如果是这样,我将如何将我的限制 JS 变量 发送到其中?

【问题讨论】:

  • 像这样指定一个默认值 - graphql.org/learn/schema/#arguments
  • 但如果它是可选的,我为什么要默认。我只是说我知道你可以设置默认值,但我不想指定默认值。如果没有指定limit,则没有我想要的默认值。这是针对我的数据库查询的,如果他们没有指定限制,那么我也不希望在我的数据库查询中使用该限制。所以指定一个整数不是我想要的。如果是限制的情况,我必须指定为 0,然后在 DB JS 代码级别检查是否为 0 >
  • 抱歉,我只是在没有深入理解您的问题的情况下发送了垃圾邮件链接。以我的经验,我有太多数据不能通过至少某种上限限制,并且总是将默认值指定为安全网。 GL w/你的实现

标签: javascript graphql


【解决方案1】:

以下是如何在客户端定义查询并传递非必需参数的示例。不确定您的客户端配置,但您可能希望使用类似 graphql-tag 的库将字符串转换为 AST。

const GET_COMPANIES = gql`
  query Companies($limit: Int) {
    companies(limit: $limit) {
      ... // return fields
    }
  }
`;

【讨论】:

  • 没有第三方我也很好。我不喜欢使用 Apollo 之类的东西。我只是使用 JS 常量和一个带有字符串的查询对象。示例:const query = { query: `query { companies(limit: ${companyLimit}) { ${fields} } }`, }; 但它在没有指定变量的情况下工作,那么为什么有必要呢?大声笑我刚刚打破了堆栈 cmets
  • 不完全清楚您的客户端实现是如何工作的,但根据我在上面看到的,您实际上是在使用模板文字传递undefined。如果你传递一个参数,它必须是你的架构定义的 Int 类型。按照我的建议,您可以在没有变量的情况下调用查询,并且应该可以正常工作。
  • 谢谢,有道理。那时它已经是可选的了,我只需要通过取消限制来更好地处理客户端查询。
【解决方案2】:

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

companies(limit: Int): [Company]

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

companies(limit: Int!): [Company]

您看到的错误与limit 参数的类型无关。问题在于您发送的查询,基于错误消息,看起来像这样:

query ($limit: Int){
  companies (limit: undefined) {
    # ...
  }
}

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

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

query ($limit: Int){
  companies (limit: $limit) {
    # ...
  }
}

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

【讨论】:

    猜你喜欢
    • 2020-09-09
    • 2019-11-22
    • 2021-01-14
    • 2018-11-28
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 2021-05-13
    相关资源
    最近更新 更多