在不知道属性的情况下将项目放入 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,其复合主键为 userIDtimestamp,我可以使用下面的代码片段来获取未知数据(设置架构时未知的属性), 但这显然效果不佳

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"
    }
}

但随后 addressname 被推入名为 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);