当前位置: 首页 > 知识库问答 >
问题:

如何在AppSync/Amplify中过滤非标量类型

闾丘德宇
2023-03-14

我正在使用AWS-放大来定义我的APPESNC模式。

我有以下简化模式:

type Country @model {
  id: ID!
  name: String!
  code: String!
  tracks: [Track] @connection(name: "CountryTrack")
}

type Track @model
  id: ID!
  name: String!
  country: Country! @connection(name: "CountryTrack")
  lng: Float
  lat: Float
  length: Float
  curves: Int
  website: String
  trackImage: String
  information: String
}

放大为模型生成过滤器输入。但是,它不包括连接类型。

我想过滤基于国家的轨道。

Dynamodb表确实有一个trackCountryId,在扫描操作中,我可以简单地根据id进行筛选。

但是,这在graphql模式中不起作用。因为FiterInput中不包括trackCountryId

有人知道如何解决这个问题吗?

共有1个答案

长孙嘉
2023-03-14

Amplify CLI在国家/地区类型上创建列表跟踪查询冲突解决程序和跟踪冲突解决程序。如果要根据countryId筛选所有曲目,则必须在以下步骤中手动添加,这些步骤基本上是上述生成的查询解析器的混合:

-

listTracksByCountry(countryId: ID!, limit: Int, nextToken: String, sortDirection: ModelSortDirection): ModelTrackConnection

-

>

  • 选择TrackTable作为数据源名称

    请求映射模板:

    #set( $limit = $util.defaultIfNull($context.args.limit, 10) )
    {
      "version": "2017-02-28",
      "operation": "Query",
      "query": {
          "expression": "#connectionAttribute = :connectionAttribute",
          "expressionNames": {
              "#connectionAttribute": "trackCountryId"
        },
          "expressionValues": {
              ":connectionAttribute": {
                  "S": "$context.args.countryId"
          }
        }
      },
      "scanIndexForward":   #if( $context.args.sortDirection )
        #if( $context.args.sortDirection == "ASC" )
    true
        #else
    false
        #end
      #else
    true
      #end,
      "filter":   #if( $context.args.filter )
    $util.transform.toDynamoDBFilterExpression($ctx.args.filter)
      #else
    null
      #end,
      "limit": $limit,
      "nextToken":   #if( $context.args.nextToken )
    "$context.args.nextToken"
      #else
    null
      #end,
      "index": "gsi-CountryTrack"
    }
    
    • 响应映射模板:
    #if( !$result )
      #set( $result = $ctx.result )
    #end
    $util.toJson($result)
    

    -

    query {
      listTracksByCountry(countryId: "countryId1") {
        items {
          id
          name
          length
        }
      }
    }
    

    您应该能够获得指定countryId的曲目列表。在我的例子中,上述操作的GraphQL输出是:

    {
      "data": {
        "listTracksByCountry": {
          "items": [
            {
              "id": "trackId1",
              "name": "track name 1",
              "length": 1.1
            },
            {
              "id": "trackId2",
              "name": "track name 2",
              "length": 1.2
            }
          ]
        }
      }
    }
    

    这似乎是一个非常常见的用例,所以请在这里随意创建一个问题,如果它还不存在,然后我们可以使用Amplify CLI(Amplify add api),自动生成这些解析器。

  •  类似资料:
    • Amplify是否支持此处概述的脱机功能:https://docs.aws.amazon.com/appsync/latest/devguide/building-a-client-app-react.html#offline-背景 我应该这样设置吗?https://aws.github.io/aws-amplify/media/api_guide#configuration-for-graphq

    • 问题内容: 我想知道,中的类(对于Web应用程序)是否有任何注释?也许@Filter吧? 我想在项目中添加自定义过滤器。 《 Spring Boot参考指南 》提到了关于 ,但是我不确定如何使用它。 问题答案: 如果您要设置第三方过滤器,则可以使用FilterRegistrationBean。例如相当于web.xml 这些将是@Configuration文件中的两个bean 上面已经用spring

    • 我想在我的项目中添加一个自定义筛选器。 Spring Boot参考指南提到了关于,但我不确定如何使用它。

    • 问题内容: 我的应用程序中有2个过滤器。根据某些条件,我想选择是否执行第二个过滤器。有没有办法做到这一点? 我做了一些谷歌搜索,但没有成功。我希望请求继续执行而不执行第二个过滤器。那可能吗? 任何帮助将不胜感激。 问题答案: 您可以在请求中设置一个属性,然后在第二个过滤器中对其进行检查。 您可以像这样简化上面的代码: 这样,您只需检查属性“ executeSecondFilter”的存在

    • 我为appsync迁移了一个Flatter本地插件来放大。现在我想知道在appsync控制台中更新GraphQL之后,如何在我的Flatter项目的android部分生成代码。 最初我使用:

    • 我正在处理一个安全过滤器,它需要根据path变量的值做一些检查。我试着这样做: 但映射始终为空,因此我的筛选器的优先级似乎高于在请求中填充属性的。 我已尝试添加以下配置: 这没有帮助,筛选器是在调用之前执行的。 在我的安全过滤器中,我获取Auth头,解密它,从中获取并将它与路径var值进行比较。如果这些ID不匹配,我返回403。 我想知道是否有可能覆盖这两个动作的顺序。或者,也许,有其他的方法来检