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

Aws lambda 当Lambda介于两者之间时,如何使用AppSync和DynamoDB正确格式化数据,aws-lambda,amazon-dynamodb,aws-appsync,Aws Lambda,Amazon Dynamodb,Aws Appsync,直接从DynamoDB使用AppSync接收数据似乎对我的情况有效,但当我尝试将lambda函数放在两者之间时,我收到的错误是“无法解析值(/issueNewMasterCard/masterCards):类型不匹配错误,预期类型列表” 查看AppSync cloudwatch响应映射输出,我得到以下结果: "context": { "arguments": { "userId": "18e946df-d3de-49a8-98b3-8b6d74dfd65

直接从DynamoDB使用AppSync接收数据似乎对我的情况有效,但当我尝试将lambda函数放在两者之间时,我收到的错误是“无法解析值(/issueNewMasterCard/masterCards):类型不匹配错误,预期类型列表”

查看AppSync cloudwatch响应映射输出,我得到以下结果:

 "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
    }
  }
}
这是我的模式:

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

type MasterCard {
    cardId: String
}

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

exports.handler = (event, context, callback) => {

    const userId = event.arguments.userId;

         const userParam = {
              Key: {
                 "userId":{S:userId}
              },
              TableName:"FidelityCardsUsers"
             }

      dynamoDB.getItem(userParam, function(err, data) {

        if (err) {
            console.log('error from DynamDB: ',err)
            callback(err);
        } else {
            console.log('mastercards: ',JSON.stringify(data));
            callback(null,data)
        }

 })

我认为问题在于,在使用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)
宏()。也就是说,您的解析器应该是:

$util.dynamodb.toDynamoDBJson($context.result.Item)
或者,您可能想看看
AWS.DynamoDB.DocumentClient
类()。这包括
getItem
等版本。这些版本可以自动将专有DynamoDB键入的内容封送和解封回本机JSON(坦白地说,我发现一直使用它会更好)


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

Hi-您能给出lambda函数的概要吗(尤其是返回值)?@thomasmichaelwallace给你,如果你还需要更多,请随时询问。
AWS.DynamoDB.DocumentClient
类是我的案例的正确解决方案,thx Thomas。