【问题标题】:AppSync query on Global Secondary Index全局二级索引上的 AppSync 查询
【发布时间】:2019-02-04 05:26:00
【问题描述】:

我正在尝试从 GSI 获取记录,但我被卡住了。

API 架构:

type DriverInfos {
    id: String!
    status: Int
    lastLat: Float
    lastLng: Float
    idDriver: String # GSI
}

type Query {
    getDriverInfosByDriver(idDriver: String): DriverInfos
}

解析器:

{
    "version" : "2017-02-28",
    "operation" : "Query",
    "index" : "idDriver-index",
    "query" : {
        ## Provide a query expression. **
        "expression": "#idDriver = :idDriver",
        "expressionNames" : {
            "#idDriver" : "idDriver"
        },
        "expressionValues" : {
            ":idDriver" : {
                "S" : "${ctx.args.idDriver}"        
            }
        }
    }
}

查询:

query getDriverInfosByDriver{
  getDriverInfosByDriver(idDriver: "1") 
    {    
      idDriver
      status
      lastLat
      lastLng 
    }
}

返回:

{
  "data": {
    "getDriverInfosByDriver": {
      "idDriver": null,
      "status": null,
      "lastLat": null,
      "lastLng": null
    }
  }
}

GSI 激活良好:名称:“idDriver-index”-PartitionKey:idDriver(字符串) 尝试使用其他 ID:2、3、...

它似乎来自解析器。我尝试了不同的解析器,但它总是返回错误。

提前感谢您的回答。

【问题讨论】:

    标签: amazon-web-services react-native graphql aws-appsync resolver


    【解决方案1】:

    问题是查询操作总是返回一组结果而不仅仅是一个。如果您想保留这样的查询类型:

    type Query {
        getDriverInfosByDriver(idDriver: String): DriverInfos
    }
    

    那么您应该将您的响应映​​射模板更改为:

    #if($ctx.result.items.size() > 0)
      $util.toJson($ctx.result.items[0])
    #else
      null
    #end
    

    如果 getDriverInfosByDriver 查询应该返回多个信息对象,那么您应该将架构更改为:

    type DriverInfo {
        id: String!
        status: Int
        lastLat: Float
        lastLng: Float
        idDriver: String # GSI
    }
    
    type DriverInfoConnection {
      items: [DriverInfo]
      nextToken:String
    }
    
    type Query {
        getDriverInfosByDriver(idDriver: String): DriverInfoConnection
    }
    

    然后您可以将您的响应映​​射模板保留为默认值:

    $util.toJson($ctx.result)
    

    然后像这样查询它

    query getDriverInfosByDriver{
      getDriverInfosByDriver(idDriver: "1") {
        items {    
          idDriver
          status
          lastLat
          lastLng 
        }
      }
    }
    

    【讨论】:

    • 非常感谢!解释得很好,真的很有帮助!我只想返回一个项目,所以我将响应映射模板更改为返回第一个项目...
    • 我刚刚在 YT 上看到了你的 AWS 网络研讨会,希望你能看看我的问题:stackoverflow.com/questions/54269487/…
    • 我想我对 AWS 的初始设置如何工作然后使用 id 因为它使用 $util.toJson($ctx.result) 感到困惑。我尝试使用用户名复制它并添加索引,但它总是返回 null。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    相关资源
    最近更新 更多