在不知道属性的情况下将项目放入 DynamoDB
Put items in DynamoDB without knowing the attributes
这感觉像是一个非常愚蠢的问题,但我缺乏 JS 知识加上缺乏 AWS 知识让我陷入困境!我只是想掌握基本的 AWS 堆栈,即 Lambda/Dynamo/API 一些基本 API 工作的网关。
如果我想要一个简单的 API 端点来处理 PUT 请求,例如https://my.endpoint.amazonaws.com/users
。如果我有一个 DynamoDB table,其复合主键为 userID
和 timestamp
,我可以使用下面的代码片段来获取未知数据(设置架构时未知的属性), 但这显然效果不佳
const dynamo = new AWS.DynamoDB.DocumentClient();
let requestJSON = JSON.parse(event.body);
await dynamo
.put({
TableName: "myDynamoTable",
Item: {
userID: requestJSON.userID,
timestamp: requestJSON.timestamp,
data: requestJSON.data
}
})
.promise();
我可以使用以下 JSON
发送 PUT
请求
{
"userID": "aaaa1111",
"timestamp": 1649677057,
"data": {
"address": "Elm Street",
"name": "Glen"
}
}
但随后 address
和 name
被推入名为 data
的单个 DynamoDB 属性中。如果我不知道这些属性,即我想使用 JSON 在我的请求中如下所示,但假设我不知道这个并且不能使用 requestJSON.address
{
"userID": "aaaa1111",
"timestamp": 1649677057,
"address": "Elm Street",
"name": "Glen"
}
如果您坚持API合同为
{
"userID": "aaaa1111",
"timestamp": 1649677057,
"data": {
"address": "Elm Street",
"name": "Glen"
}
}
然后你可以在 TypeScript 级别上进行映射
const request: {userID: string, timestamp: number, data: any} = {
"userID": "aaaa1111",
"timestamp": 1649677057,
"data": {
"address": "Elm Street",
"name": "Glen"
}
};
const ddbObject: any = {
"userID": request.userID,
"timestamp": request.timestamp
};
Object
.keys(request.data)
.forEach(key => ddbObject[key] = request.data[key]);
ddbObject
的表示是
{
"userID": "aaaa1111",
"timestamp": 1649677057,
"address": "Elm Street",
"name": "Glen"
}
您可以使用spread运算符,例如:
const data = {
address: "Elm Street",
name: "Glen",
};
const item = {
userID: "aaaa1111",
timestamp: 1649677057,
...data,
};
console.log("item:", item);
这感觉像是一个非常愚蠢的问题,但我缺乏 JS 知识加上缺乏 AWS 知识让我陷入困境!我只是想掌握基本的 AWS 堆栈,即 Lambda/Dynamo/API 一些基本 API 工作的网关。
如果我想要一个简单的 API 端点来处理 PUT 请求,例如https://my.endpoint.amazonaws.com/users
。如果我有一个 DynamoDB table,其复合主键为 userID
和 timestamp
,我可以使用下面的代码片段来获取未知数据(设置架构时未知的属性), 但这显然效果不佳
const dynamo = new AWS.DynamoDB.DocumentClient();
let requestJSON = JSON.parse(event.body);
await dynamo
.put({
TableName: "myDynamoTable",
Item: {
userID: requestJSON.userID,
timestamp: requestJSON.timestamp,
data: requestJSON.data
}
})
.promise();
我可以使用以下 JSON
发送PUT
请求
{
"userID": "aaaa1111",
"timestamp": 1649677057,
"data": {
"address": "Elm Street",
"name": "Glen"
}
}
但随后 address
和 name
被推入名为 data
的单个 DynamoDB 属性中。如果我不知道这些属性,即我想使用 JSON 在我的请求中如下所示,但假设我不知道这个并且不能使用 requestJSON.address
{
"userID": "aaaa1111",
"timestamp": 1649677057,
"address": "Elm Street",
"name": "Glen"
}
如果您坚持API合同为
{
"userID": "aaaa1111",
"timestamp": 1649677057,
"data": {
"address": "Elm Street",
"name": "Glen"
}
}
然后你可以在 TypeScript 级别上进行映射
const request: {userID: string, timestamp: number, data: any} = {
"userID": "aaaa1111",
"timestamp": 1649677057,
"data": {
"address": "Elm Street",
"name": "Glen"
}
};
const ddbObject: any = {
"userID": request.userID,
"timestamp": request.timestamp
};
Object
.keys(request.data)
.forEach(key => ddbObject[key] = request.data[key]);
ddbObject
的表示是
{
"userID": "aaaa1111",
"timestamp": 1649677057,
"address": "Elm Street",
"name": "Glen"
}
您可以使用spread运算符,例如:
const data = {
address: "Elm Street",
name: "Glen",
};
const item = {
userID: "aaaa1111",
timestamp: 1649677057,
...data,
};
console.log("item:", item);