Amazon web services 在AWS Api网关中定义可选属性->;DynamoDB映射

Amazon web services 在AWS Api网关中定义可选属性->;DynamoDB映射,amazon-web-services,amazon-dynamodb,aws-api-gateway,Amazon Web Services,Amazon Dynamodb,Aws Api Gateway,我的看法如下: 以这个博客为例,我想强调通过Api网关向dynamodb表前端写入数据的内容和方式。为此,我在Api网关中定义了以下映射: { "TableName": "Comments", "Item": { "commentId": { "S": "$context.requestId" }, "pageId": { "S": "$input.path('$.pageId')" },

我的看法如下:

以这个博客为例,我想强调通过Api网关向dynamodb表前端写入数据的内容和方式。为此,我在Api网关中定义了以下映射:

{ 
    "TableName": "Comments",
    "Item": {
      "commentId": {
        "S": "$context.requestId"
       },
       "pageId": {
         "S": "$input.path('$.pageId')"
       },
       "userName": {
         "S": "$input.path('$.userName')"
       },
       "message": {
         "S": "$input.path('$.message')"
       }
    }
}
接下来,使用以下示例进行测试效果很好:

{
  "pageId": "breaking-news-story-01-18-2016",
  "userName": "Just Saying Thank You",
  "message": "I really enjoyed this story!!"
}
但是,假设我希望保持与上面相同的映射,但希望将
消息
设置为可选。我该怎么做?我不能让它工作。我试过:

  • 按原样使用上述映射,但发送正文时不带
    消息
    -属性。-->“一个或多个参数值无效:AttributeValue不能包含空字符串” 2按原样使用上述映射,但发送带有
    message=null的正文-->“一个或多个参数值无效:AttributeValue不能包含空字符串”
  • 通过省略
    mapping
    ->的定义来更改上述映射,现在在不传递
    消息的情况下传递一个body,显然会成功。但是,发送带有
    消息的正文
    并不能传递
    消息
    (这是我所期望的,但希望用尽所有选项)
  • 根本不要使用映射。显然这是可行的,但是现在所有的东西都是未经过滤的,这是不需要的
    显然,我可以使用AWS lambda来进行映射,但这感觉像是一个常见的用例,即:可选属性,这必须可以直接在Api网关中实现。

    您介意尝试此映射模板吗?如果消息为空,则不会将其添加到正文中

    { 
        "TableName": "Comments",
        "Item": {
          "commentId": {
            "S": "$context.requestId"
           },
           "pageId": {
             "S": "$input.path('$.pageId')"
           },
           "userName": {
             "S": "$input.path('$.userName')"
           }#if ($.message),
           "message": {
             "S": "$input.path('$.message')"
           }
           #end
        }
    }
    
    谢谢, -Ka Hou

    由@Ka提供:

    解释:APi网关使用空字符串或其他内容自动填充不存在的属性。这需要从if中排除

    还要注意if语句后面的关键

    { 
        "TableName": "Comments",
        "Item": {
          "commentId": {
            "S": "$context.requestId"
           },
           "pageId": {
             "S": "$input.path('$.pageId')"
           },
           "userName": {
             "S": "$input.path('$.userName')"
           }#if($input.path('$.description') && $input.path('$.message') != ""),
           "message": {
             "S": "$input.path('$.message')"
           }
           #end
        }
    }
    

    遗憾的是,这不起作用:
    由于配置错误而执行失败:无法转换请求
    使其工作。谢谢你给我指明了正确的方向。看到我的答案了吗