node.js - DynamoDB createIfNotExist
问题描述
在 dynamoDB 中,我应该创建某种日志信息,这些信息具有用户可以更改的状态。但这是不必要的额外信息。主要问题是:
- 我有一个对象:
{
id: '123',
log: 'mybestlog',
state: 'PENDING'
}
id
如果相同的文档不存在,我想创建这个文档对象。id
如果具有相同退出的对象,我想取回当前对象和标志。
希望我说得足够清楚。
我试着做:
const result: PutItemOutput = await this.dynamodbClient.put({
TableName: this.config.tableName,
Item: {
...newItem,
status: statusEnum.PENDING,
creationDate: moment().toISOString(),
},
ConditionExpression: 'attribute_not_exists(id)',
ReturnValues: 'ALL_NEW',
})
.promise()
.catch((error) => {
this.logger.error(`### END-ERROR ${methodDescription} | error: ${error}`, metadata);
throw new InternalServerErrorException(error.stack);
});
但找不到任何响应Items
或标志Exist
。我得到了AWS.DynamoDB.PutItemOutput
:
{
Attributes?,
ConsumedCapacity?,
ItemCollectionMetrics?,
}
请帮助我,在我的情况下最好的解决方案是什么。
解决方案
您不会按照您的想法收到带有项目在 dynamoDB 中退出的标志的响应。
当您使用该ConditionExpression调用 put 操作时。两个主要结果以及对您重要的结果是:
- 您的ConditionExpression成功,您将在Attributes Key中获得ALL_NEW值。
- 否则你会得到一些错误。对您来说重要的是ConditionalCheckFailedException,这意味着ConditionExpression失败并且密钥已经存在。
您需要相应地自行调整响应。
推荐阅读
- c# - 异步任务
() 不使用 await 时不会立即返回 - php - Twitter webhook 注册错误 | {"errors":[{"code":32,"message":"无法验证您的身份。"}]}
- symfony - symfony2 无法读取未定义的属性“fnIsDatatable”
- javascript - 用于传递变量的脏 HTML 或脏 jQuery?
- jquery - 如何简化具有多个导航菜单的网站的 jQuery 脚本?
- flask - 带有 Flask 服务器的 Vue.js ... 直接在浏览器中输入 url 不会使用 vue.js 进行渲染。
- windows-10 - 在 Windows 10 中连接 USB 时自动打开记事本
- spring-boot - spring 将 RedisLockRegistry 与 spring-context 集成
- image - tex to odt with pandoc eps 图片
- angular - karma jasmine firefox runner中的超时异步回调