Amazon dynamodb 身体映射模板+;API网关

Amazon dynamodb 身体映射模板+;API网关,amazon-dynamodb,aws-api-gateway,Amazon Dynamodb,Aws Api Gateway,因此,我正在尝试为一个API POST方法设置一个基本POST,该方法连接到一个简单的dynamodb。我有以下身体映射模板: { "TableName": "bars", "Item": { "barid": { "S": "$input.path('$.barid')" }, "phone": { "S": "$input.path('$.phone')" }, "location": { "S": "$input.path('$.locatio

因此,我正在尝试为一个API POST方法设置一个基本POST,该方法连接到一个简单的dynamodb。我有以下身体映射模板:

{ 
"TableName": "bars",
"Item": {
  "barid": {
    "S": "$input.path('$.barid')"
  },
  "phone": {
    "S": "$input.path('$.phone')"
  },
  "location": {
    "S": "$input.path('$.location')"
  },
  "happyhour": {
    "L": [
      {
        "M": {
          "Time": {
            "S": "$input.path('$.Time')"
          },
          "Deal": {
            "S": "$input.path('$.Deal')"
          },
          "Day": {
            "S": "$input.path('$.Day')"
          }
        }
      },
      {
        "M": {
          "Time": {
            "S": "$input.path('$.Time')"
          },
          "Deal": {
            "S": "$input.path('$.Deal')"
          },
          "Day": {
            "S": "$input.path('$.Day')"
          }
        }
      },
      {
        "M": {
          "Time": {
            "S": "$input.path('$.Time')"
          },
          "Deal": {
            "S": "$input.path('$.Deal')"
          },
          "Day": {
            "S": "$input.path('$.Day')"
          }
        }
      },
      {
        "M": {
          "Time": {
            "S": "$input.path('$.Time')"
          },
          "Deal": {
            "S": "$input.path('$.Deal')"
          },
          "Day": {
            "S": "$input.path('$.Day')"
          }
        }
      },
      {
        "M": {
          "Time": {
            "S": "$input.path('$.Time')"
          },
          "Deal": {
            "S": "$input.path('$.Deal')"
          },
          "Day": {
            "S": "$input.path('$.Day')"
          }
        }
      },
      {
        "M": {
          "Time": {
            "S": "$input.path('$.Time')"
          },
          "Deal": {
            "S": "$input.path('$.Deal')"
          },
          "Day": {
            "S": "$input.path('$.Day')"
          }
        }
      },
      {
        "M": {
          "Time": {
            "S": "$input.path('$.Time')"
          },
          "Deal": {
            "S": "$input.path('$.Deal')"
          },
          "Day": {
            "S": "$input.path('$.Day')"
          }
        }
      }
    ]
  },
  "name": {
    "S": "$input.path('$.name')"
  }
}
}
以下是我测试post语句的内容:

{
"barid": {
    "S": "005"
},
"happyhour": {
    "L": [{
        "M": {
            "Time": {
                "S": "11AM-9AM"
            },
            "Deal": {
                "S": "$3 Mimosas; $3 Bloody Marys"
            },
            "Day": {
                "S": "Sunday"
            }
        }
    }, {
        "M": {
            "Time": {
                "S": "4PM - 9PM"
            },
            "Deal": {
                "S": "$4 Margaritas, Corona, Corona Light; $3 Bud Light Lime"
            },
            "Day": {
                "S": "Monday"
            }
        }
    }, {
        "M": {
            "Time": {
                "S": "4PM-9PM"
            },
            "Deal": {
                "S": "1/2 Price Burgers; $2 Bud and Bud Light Drafts"
            },
            "Day": {
                "S": "Tuesday"
            }
        }
    }, {
        "M": {
            "Time": {
                "S": "4PM-9PM"
            },
            "Deal": {
                "S": "$2 Drafts; $3 Food Menu"
            },
            "Day": {
                "S": "Wednesday"
            }
        }
    }, {
        "M": {
            "Time": {
                "S": "4PM-9PM"
            },
            "Deal": {
                "S": "$2 Beers, House Liquor, Flavored Vodka; 1/2 Price Wings; $5 Pizzas or Pasta Bowl"
            },
            "Day": {
                "S": "Thursday"
            }
        }
    }, {
        "M": {
            "Time": {
                "S": "4PM-9PM"
            },
            "Deal": {
                "S": "$5 Red Bull House Liquor Cocktails; $5 Wings, Nachos, Sliders, Flatbreads; $5 Finlandia Cocktails and Martinis; $15 Sam Adams Light Buckets"
            },
            "Day": {
                "S": "Friday"
            }
        }
    }, {
        "M": {
            "Time": {
                "S": "None"
            },
            "Deal": {
                "S": "None"
            },
            "Day": {
                "S": "Sunday"
            }
        }
    }]
},
"phone": {
    "S": "(703) 527-1600"
},
"location": {
    "S": "3100 Clarendon Blvd, Arlington, VA 22201"
},
"name": {
    "S": "Mister Days"
}
}

每当我运行它时,它似乎填充了barid、phone和location字段,但happyhour数组为空。下面是我运行测试后在日志中得到的内容

"TableName": "bars",
"Item": {
  "barid": {
    "S": "{S=005}"
  },
  "phone": {
    "S": "{S=(703) 527-1576}"
  },
  "location": {
    "S": "{S=2500 Hess Road}"
  },
  "happyhour": {
    "L": [
      {
        "M": {
          "Time": {
            "S": ""
          },
          "Deal": {
            "S": ""
          },
          "Day": {
            "S": ""
          }
        }
      },
      {
        "M": {
          "Time": {
            "S": ""
          },
          "Deal": {
            "S": ""
          },
          "Day": {
            "S": ""
          }
        }
      },
      {
        "M": {
          "Time": {
            "S": ""
          },
          "Deal": {
            "S": ""
          },
          "Day": {
            "S": ""
          }
   [TRUNCATED]
Thu Jun 30 15:36:27 UTC 2016 : Endpoint response body before transformations: {"__type":"com.amazon.coral.service#UnknownOperationException"}

我不确定我做错了什么,但任何事情都会有帮助。谢谢

看起来happyhour包含一个对象,该对象具有一个名为L的属性,该属性包含一个对象数组。您可能希望在数组上循环,以便无论数组的长度如何,映射模板都能正常工作。您还需要根据输入中的项目的完整路径而不仅仅是名称来引用这些项目

应该是这样的

#set($inputRoot = $input.path('$'))
{ 
"TableName": "bars",
"Item": {
  "barid": {
    "S": "$inputRoot.barid.S"
  },
  "name": {
    "S": "$inputRoot.name.S"
  },
  "phone": {
    "S": "$inputRoot.phone.S"
  },
  "location": {
    "S": "$inputRoot.location.S"
  },

  "happyhour": {
    "L": [
#foreach($elem in $inputRoot.happyhour.L)
      {
        "M": {
          "Time": {
            "S": "$elem.M.Time.S"
          },
          "Deal": {
            "S": "$elem.M.Deal.S"
          },
          "Day": {
            "S": "$elem.M.Day.S"
          }
        }
      }#if($foreach.hasNext),#end
#end
    ]
  }
}
#set($inputRoot = $input.path('$'))
{ 
"TableName": "bars",
"Item": {
  "barid": "$inputRoot.barid.S",
  "name": "$inputRoot.name.S",
  "phone": "$inputRoot.phone.S",
  "location": "$inputRoot.location.S",
  "happyhour": [
#foreach($elem in $inputRoot.happyhour.L)
      {
          "Time": "$elem.M.Time.S",
          "Deal": "$elem.M.Deal.S",
          "Day": "$elem.M.Day.S"
      }#if($foreach.hasNext),#end
#end
  ]
}
请注意,映射模板顺序和输出顺序不必与输入顺序匹配。此外,您不必保持完全相同的结构。例如,您可以删除所有额外的类型信息,并像这样输出更干净的json

#set($inputRoot = $input.path('$'))
{ 
"TableName": "bars",
"Item": {
  "barid": {
    "S": "$inputRoot.barid.S"
  },
  "name": {
    "S": "$inputRoot.name.S"
  },
  "phone": {
    "S": "$inputRoot.phone.S"
  },
  "location": {
    "S": "$inputRoot.location.S"
  },

  "happyhour": {
    "L": [
#foreach($elem in $inputRoot.happyhour.L)
      {
        "M": {
          "Time": {
            "S": "$elem.M.Time.S"
          },
          "Deal": {
            "S": "$elem.M.Deal.S"
          },
          "Day": {
            "S": "$elem.M.Day.S"
          }
        }
      }#if($foreach.hasNext),#end
#end
    ]
  }
}
#set($inputRoot = $input.path('$'))
{ 
"TableName": "bars",
"Item": {
  "barid": "$inputRoot.barid.S",
  "name": "$inputRoot.name.S",
  "phone": "$inputRoot.phone.S",
  "location": "$inputRoot.location.S",
  "happyhour": [
#foreach($elem in $inputRoot.happyhour.L)
      {
          "Time": "$elem.M.Time.S",
          "Deal": "$elem.M.Deal.S",
          "Day": "$elem.M.Day.S"
      }#if($foreach.hasNext),#end
#end
  ]
}

看起来happyhour包含一个对象,该对象具有一个名为L的属性,该属性包含一个对象数组。您可能希望在数组上循环,以便无论数组的长度如何,映射模板都能正常工作。您还需要根据输入中的项目的完整路径而不仅仅是名称来引用这些项目

应该是这样的

#set($inputRoot = $input.path('$'))
{ 
"TableName": "bars",
"Item": {
  "barid": {
    "S": "$inputRoot.barid.S"
  },
  "name": {
    "S": "$inputRoot.name.S"
  },
  "phone": {
    "S": "$inputRoot.phone.S"
  },
  "location": {
    "S": "$inputRoot.location.S"
  },

  "happyhour": {
    "L": [
#foreach($elem in $inputRoot.happyhour.L)
      {
        "M": {
          "Time": {
            "S": "$elem.M.Time.S"
          },
          "Deal": {
            "S": "$elem.M.Deal.S"
          },
          "Day": {
            "S": "$elem.M.Day.S"
          }
        }
      }#if($foreach.hasNext),#end
#end
    ]
  }
}
#set($inputRoot = $input.path('$'))
{ 
"TableName": "bars",
"Item": {
  "barid": "$inputRoot.barid.S",
  "name": "$inputRoot.name.S",
  "phone": "$inputRoot.phone.S",
  "location": "$inputRoot.location.S",
  "happyhour": [
#foreach($elem in $inputRoot.happyhour.L)
      {
          "Time": "$elem.M.Time.S",
          "Deal": "$elem.M.Deal.S",
          "Day": "$elem.M.Day.S"
      }#if($foreach.hasNext),#end
#end
  ]
}
请注意,映射模板顺序和输出顺序不必与输入顺序匹配。此外,您不必保持完全相同的结构。例如,您可以删除所有额外的类型信息,并像这样输出更干净的json

#set($inputRoot = $input.path('$'))
{ 
"TableName": "bars",
"Item": {
  "barid": {
    "S": "$inputRoot.barid.S"
  },
  "name": {
    "S": "$inputRoot.name.S"
  },
  "phone": {
    "S": "$inputRoot.phone.S"
  },
  "location": {
    "S": "$inputRoot.location.S"
  },

  "happyhour": {
    "L": [
#foreach($elem in $inputRoot.happyhour.L)
      {
        "M": {
          "Time": {
            "S": "$elem.M.Time.S"
          },
          "Deal": {
            "S": "$elem.M.Deal.S"
          },
          "Day": {
            "S": "$elem.M.Day.S"
          }
        }
      }#if($foreach.hasNext),#end
#end
    ]
  }
}
#set($inputRoot = $input.path('$'))
{ 
"TableName": "bars",
"Item": {
  "barid": "$inputRoot.barid.S",
  "name": "$inputRoot.name.S",
  "phone": "$inputRoot.phone.S",
  "location": "$inputRoot.location.S",
  "happyhour": [
#foreach($elem in $inputRoot.happyhour.L)
      {
          "Time": "$elem.M.Time.S",
          "Deal": "$elem.M.Deal.S",
          "Day": "$elem.M.Day.S"
      }#if($foreach.hasNext),#end
#end
  ]
}

如果您真的想在API中进行映射,这可能不是正确的方法,但您可以将问题留给aws sdk解决

您可以在API和dynamoDB之间创建一个简单的lambda函数。使用Aws提供的一些方法:

我用这个函数处理了一个类似的问题:

var AWS = require("aws-sdk");

var docClient = new AWS.DynamoDB.DocumentClient();
var tableName = "tableName";

var saveData = function (data) {

  var params = {
    TableName: tableName,
    Item: data
  };

  docClient.put(params, function (err, data) {
    if (err) {
      console.error("Unable to add item. Error JSON:", JSON.stringify(err, null, 2));
    } else {
      console.log("Added item:", JSON.stringify(data, null, 2));
    }
  });

};

exports.handler = function (event) {
    saveData(event);
};

如果您真的想在API中进行映射,这可能不是正确的方法,但您可以将问题留给aws sdk解决

您可以在API和dynamoDB之间创建一个简单的lambda函数。使用Aws提供的一些方法:

我用这个函数处理了一个类似的问题:

var AWS = require("aws-sdk");

var docClient = new AWS.DynamoDB.DocumentClient();
var tableName = "tableName";

var saveData = function (data) {

  var params = {
    TableName: tableName,
    Item: data
  };

  docClient.put(params, function (err, data) {
    if (err) {
      console.error("Unable to add item. Error JSON:", JSON.stringify(err, null, 2));
    } else {
      console.log("Added item:", JSON.stringify(data, null, 2));
    }
  });

};

exports.handler = function (event) {
    saveData(event);
};

我试着运行你建议的第二部分,但出于某种原因,它在日志中仍然给我一个序列化错误它正确映射了所有内容,但出于某种原因,它仍然给我序列化错误我试着运行你建议的第二部分,但出于某种原因,它在它映射的日志中仍然给我一个序列化错误一切都正确,但出于某种原因,它仍然给我序列化错误