当前位置: 首页 > 知识库问答 >
问题:

在不知道属性的情况下将项目放入 DynamoDB 中

彭炳
2023-03-14

这感觉是一个非常愚蠢的问题,但我缺乏JS知识加上缺乏AWS知识让我陷入困境!我只是想掌握基本的AWS堆栈,即Lambda/Dynamo/API网关,以进行一些基本的API工作。

如果我想要一个简单的APIendpoint来处理PUT请求,例如https://my.endpoint.amazonaws.com/users。如果我有一个DynamoDB表,它的复合主键是userID时间戳,我可以使用下面的代码片段来获取未知数据(设置模式时未知的属性),但这显然效果不佳

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

但是地址名称被塞进一个名为data的DynamoDB属性中。如果我不知道这些属性,即我想在下面的请求中使用JSON,但假设我不知道这一点并且不能使用requestJSON.address

{
    "userID": "aaaa1111",
    "timestamp": 1649677057,
    "address": "Elm Street",
    "name": "Glen"
}

共有2个答案

蒋嘉颖
2023-03-14

如果你坚持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]);

ddb 对象的表示形式

{
  "userID": "aaaa1111",
  "timestamp": 1649677057,
  "address": "Elm Street",
  "name": "Glen"
} 
鲍理
2023-03-14

您可以使用扩展运算符,例如:

js lang-js prettyprint-override">const data = {
  address: "Elm Street",
  name: "Glen",
};

const item = {
  userID: "aaaa1111",
  timestamp: 1649677057,
  ...data,
};

console.log("item:", item);
 类似资料:
  • 本文向大家介绍MySQL在不知道列名情况下的注入详解,包括了MySQL在不知道列名情况下的注入详解的使用技巧和注意事项,需要的朋友参考一下 前言 最近感觉脑子空空,全在为了刷洞去挖洞,还是回归技术的本身让自己舒服些。好了,下面话不多说了,来一起看看详细的介绍吧 前提 以下情况适用于 MySQL < 5版本,或者在 MySQL >= 5 的版本[存在information_schema库],且已获取

  • 我正在尝试在我的应用程序中实现会话过期。因此,当用户令牌过期时,我想导航到登录片段并清除后端堆栈上的所有现有目标。我知道这是可以通过和实现的,但是正在进行大量条件导航,并且在导航到登录片段时无法确定popUpTo的目标。有没有办法简单地导航到新片段并清除后端堆栈上的所有其他目标?

  • 问题内容: 我有个问题。我正在尝试将一些字符串转换为日期,但我不知道日期到达的格式。 这或许让他们或等。 如何将这些字符串转换为Date?我尝试了这个: 但是,当我打印出someDate时,它的打印方式是这样的:2019-08-05 12:42:48.638 CEST这意味着,但是当我运行以上代码时,日期对象现在变成了,至少可以这样说。 有什么想法可以正确格式化日期格式吗? 问题答案: 你不能!

  • 我使用键值存储作为我的Go语言应用程序的后端,日期作为键(保持条目排序),json文档作为值。json的顶级命名空间()以及和存在于我存储的每个json文档中,但在其他方面存在一些差异(尤其是关于一些嵌套的json数据),所以当keyI从数据库中提取时,我真的不知道我在循环浏览的任何时间提取了什么。这是json数据的示例 当我从数据库中提取数据时,我要做的第一件事是将每个条目解组到<code>ma

  • 我正在编写简单的程序来执行Amazon DynamoDB操作,我有两个问题, 我想使用updateItem更新参数“year”,但出现了一个错误 表达式属性值包含无效键:语法错误;键:val(服务:Amazon DynamoDBv2;状态代码:400;错误代码:ValidationExcture;请求ID:K6B8GC69295KUV9V7J10OCAFJJV4KQNSO5AEMVJF66Q9AS

  • 有一个行为我找不到相关的留档。让我们假设以下代码。它应该在控制台中显示使用foo.bar属性配置的内容: 如果您在application.yml()中设置了以下属性,它将被正确地拾取并在控制台中显示“fromapplication.yml”,没什么花哨的 现在,如果您使用完全相同的代码,但这次您想使用命令行参数覆盖application.yml中定义的属性,并将--设置为命令行arg(请注意,这次