当Lambda在两者之间时,如何使用AppSync和DynamoDB正确格式化数据

时间:2018-10-26 14:59:52

标签: aws-lambda amazon-dynamodb aws-appsync

直接从DynamoDB使用AppSync接收数据似乎适合我的情况,但是当我尝试在两者之间放置lambda函数时,我收到错误消息,提示“无法解析值(/ issueNewMasterCard / masterCards):不匹配错误,预期类型为LIST“

查看AppSync cloudwatch响应映射输出,我得到了:

Global.asax.cs

这是我配置响应映射模板的方式:

 "context": {
        "arguments": {
            "userId": "18e946df-d3de-49a8-98b3-8b6d74dfd652"
        },
        "result": {
            "Item": {
                "masterCards": {
                    "L": [
                        {
                            "M": {
                                "cardId": {
                                    "S": "95d67f80-b486-11e8-ba85-c3623f6847af"
                            },
                                "cardImage": {
                                    "S": "https://s3.eu-central-1.amazonaws.com/logo.png"
                                },
                                "cardWallet": {
                                    "S": "0xFDB17d12057b6Fe8c8c434653456435634565"
                                },...............

我正在做这种突变:

$utils.toJson($context.result.Item)

这是我的模式:

mutation IssueNewMasterCard {
  issueNewMasterCard(userId:"18e946df-d3de-49a8-98b3-8b6d74dfd652"){
    masterCards {
      cardId
    }
  }
}

Lambda函数:

type User {
    userId: ID!
    masterCards: [MasterCard]
}

type MasterCard {
    cardId: String
}

type Mutation {
    issueNewMasterCard(userId: ID!): User
}

1 个答案:

答案 0 :(得分:1)

我认为问题在于使用DynamoDB数据源时使用的getItem与aws-sdk中的DynamoDB.getItem函数不同。

具体来说,数据源版本似乎返回了已经编组的响应(也就是说,它不是返回something: { L: [ list of things ] }而是返回something: [ list of things])。

这很重要,因为这意味着当前设置中的$utils.toJson($context.result.Item)返回{ masterCards: { L: [ ...,这就是为什么您看到类型错误的原因-在这种情况下,masterCards是一个带有键L,而不是数组/列表。

要在解析器中解决此问题,可以使用$util.dynamodb.toDynamoDBJson(Object)宏(https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference.html#dynamodb-helpers-in-util-dynamodb)。即您的解析器应该是:

$util.dynamodb.toDynamoDBJson($context.result.Item)

或者,您可能希望查看AWS.DynamoDB.DocumentClient类(https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html)。这包括getItem等版本,这些版本会自动封送和解组专有的DynamoDB,以键入原始JSON。 (坦率地说,我发现它更容易使用并一直使用)。

在这种情况下,您可以保留旧的解析程序,因为您将返回masterCards 只是一个JSON数组的对象。