全局二级索引上的AppSync查询

时间:2018-08-29 12:12:24

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

我正试图从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,...

它似乎来自解析器。我尝试使用其他解析器,但始终会返回错误。

预先感谢您的回答。

1 个答案:

答案 0 :(得分:5)

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

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 
    }
  }
}