【问题标题】:How to avoid implicit 'null' substitution in GraphQL (AWS App Sync)?如何避免 GraphQL (AWS App Sync) 中的隐式“空”替换?
【发布时间】:2020-06-03 16:20:31
【问题描述】:

考虑以下查询:

const fetchItemsQuery = `query(
  $paginationPageSize: Int! 
  $paginationPageNumber: Int!
  $searchByNameRequest: String
  $categoryID: String
) {
  getItems(
    paginationPageSize: $paginationPageSize
    paginationPageNumber: $paginationPageNumber
    searchByNameRequest: $searchByNameRequest
    categoryID: $categoryID
  ) {
    // ...
  }
};

如果使用变量从客户端提交:

{
  paginationPageSize: 20,
  paginationPageNumber: 1
}

在 AWS App Sync 日志中,它显示:

{
  paginationPageSize: 20,
  paginationPageNumber: 1,
  searchByNameRequest: null,
  categoryID: null
}

我检查了来自浏览器的请求负载 - 没有空值,只是

{
  paginationPageSize: 20,
  paginationPageNumber: 1
}

所以原因不在前端。

我发现null 替换发生在请求解析模板中:

{
  "version" : "2017-02-28",
  "operation": "Invoke",
  "payload": {
    "field": "listProduct",
    "arguments": $util.toJson($context.args) // <- here
  }
}

$util.toJson 使用 Apache Velocity。

我可以避免$util.toJson($context.args) 将替换我的请求变量中的空值吗?

重要提示:解决方案不应接触显式提交的空值。

【问题讨论】:

  • 您最终解决了这个问题吗?与 undefined 或 non-present 相比,认为 null 在 GraphQL 中没有意义,appsync 似乎很糟糕。下面的默认选项似乎是一个 hacky 解决方法

标签: amazon-web-services graphql velocity aws-appsync


【解决方案1】:

您可以尝试从 $context.args 映射中过滤掉空参数。

#set( $args = {} )
#foreach( $entry in $context.args.entrySet())
  #if( $entry.value != $null )
    #set( $junk = $args.put($entry.key, $entry.value) )
  #end
#end

{
  "version" : "2017-02-28",
  "operation": "Invoke",
  "payload": {
    "field": "listProduct",
    "arguments": $util.toJson($args)
  }
}

【讨论】:

  • 感谢您的回答!但是如果明确提交了 null 呢?
  • @GurebuBokofu 您可以将 ` = "DEFAULT"` 等默认值分配给 GraphQL 参数,并检查该值以发现未指定的参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-03
  • 1970-01-01
  • 2019-03-15
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
相关资源
最近更新 更多