Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 为什么;documentClient.put";是否在DynamoDB中执行更新而不是插入?_Node.js_Typescript_Amazon Web Services_Amazon Dynamodb_Documentclient - Fatal编程技术网

Node.js 为什么;documentClient.put";是否在DynamoDB中执行更新而不是插入?

Node.js 为什么;documentClient.put";是否在DynamoDB中执行更新而不是插入?,node.js,typescript,amazon-web-services,amazon-dynamodb,documentclient,Node.js,Typescript,Amazon Web Services,Amazon Dynamodb,Documentclient,我有一个简单的逻辑,我想使用AWS.DynamoDB.DocumentClient在表中插入记录。下面是我正在使用的代码。在这里,我注意到.put正在更新记录,但不确定原因 在CW中检查日志时,我没有看到任何错误,因此不确定我在这里遗漏了什么 代码: async addEvent(incomingModel: MyModel): Promise <MyModel> { const dynamoModel: MyModel = { fieldOne: incom

我有一个简单的逻辑,我想使用
AWS.DynamoDB.DocumentClient在表中插入
记录。下面是我正在使用的代码。在这里,我注意到
.put
正在更新记录,但不确定原因

在CW中检查日志时,我没有看到任何错误,因此不确定我在这里遗漏了什么

代码:

async addEvent(incomingModel: MyModel): Promise <MyModel> {
    const dynamoModel: MyModel = {
        fieldOne: incomingModel.fieldOne,
        fieldTwo: incomingModel.fieldTwo,
        "One#two#three": `${incomingModel.one}#${incomingModel.two}#${incomingModel.three}`,
        fieldThree: incomingModel.fieldThree,
        fieldFour: incomingModel.fieldFour,
    };

    var params = {
        TableName: 'Table',
        Item: dynamoModel,
    };

    return this.documentClient
        .put(params)
        .then((data) => {
            this.logger.debug(
                "Response received from Dynamo after adding an incomingModel",
                data,
                this.constructor.name,
            );

            return data as MyModel;
        })
        .catch((error) => {
            const errorMessage = JSON.stringify(error);
            this.logger.error(
                `Error creating incomingModel with body of ${errorMessage}`,
                error,
                this.constructor.name,
            );
            throw error;
        });
}
异步addEvent(incomingModel:MyModel):承诺{ 常量动态模型:MyModel={ fieldOne:incomingModel.fieldOne, Field2:incomingModel.Field2, “一#二#三”:“${incomingModel.一}${incomingModel.二}${incomingModel.三}”, 字段三:输入模型。字段三, fieldFour:incomingModel.fieldFour, }; 变量参数={ TableName:'表', 项目:dynamoModel, }; 返回此.documentClient .put(参数) 。然后((数据)=>{ 此为.logger.debug( “添加incomingModel后收到Dynamo的响应”, 数据 this.constructor.name, ); 以MyModel的形式返回数据; }) .catch((错误)=>{ const errorMessage=JSON.stringify(错误); 这是一个错误( `创建主体为${errorMessage}`的incomingModel时出错, 错误 this.constructor.name, ); 投掷误差; }); }
这是
put
操作的预期行为。从(我的)重点:

创建新项目,或用新项目替换旧项目。如果指定表中已存在与新项具有相同主键的项,则新项将完全替换现有项


这是
put
操作的预期行为。从(我的)重点:

创建新项目,或用新项目替换旧项目。如果指定表中已存在与新项具有相同主键的项,则新项将完全替换现有项


正如赛斯所提到的,这是DynamoDb的默认行为

要避免更新,可以使用“ConditionExpression”。在我的示例中,我将HashKey命名为“PK”,将RangeKey命名为“SK”:

async function put(Item, TableName){
    const params = {
        TableName,
        Item,
        ExpressionAttributeNames : {
            '#pk' : 'PK',
            '#sk' : 'SK',
        },
        ConditionExpression : 'attribute_not_exists(#pk) AND attribute_not_exists(#sk)',
    };
    
    const result = await documentClient.put(params).promise();
    
    // ... do the rest....

}
如果项目已经存在(两个键都匹配),事务将失败,并给出一个
“ConditionalCheckFailedException:条件请求失败”


我希望这将是有用的

正如赛斯所提到的,这是DynamoDb的默认行为

要避免更新,可以使用“ConditionExpression”。在我的示例中,我将HashKey命名为“PK”,将RangeKey命名为“SK”:

async function put(Item, TableName){
    const params = {
        TableName,
        Item,
        ExpressionAttributeNames : {
            '#pk' : 'PK',
            '#sk' : 'SK',
        },
        ConditionExpression : 'attribute_not_exists(#pk) AND attribute_not_exists(#sk)',
    };
    
    const result = await documentClient.put(params).promise();
    
    // ... do the rest....

}
如果项目已经存在(两个键都匹配),事务将失败,并给出一个
“ConditionalCheckFailedException:条件请求失败”


我希望这将是有用的

这对于
PutItem
来说是正确的,但是这里我使用的是
Put
。在这里,嗯,我不确定我是否注意到了区别。
Put
API说“通过委托给
AWS.DynamoDB.putItem()
,创建一个新项,或者用一个新项替换一个旧项”。我不知道你的主键是什么样子,但也许这就是这里发生的事情。DynamoDB认为您正在操作一个旧项目,并将其委托给putItem。你期待什么样的行为?我假设您希望使用
put
操作创建(而不是更新)记录。这个假设正确吗?是的。这就是预期。如果您正在对DynamoDB中已经存在的项执行
put
操作,则客户端的行为符合预期<如果不存在具有该主键的项,则代码>放置
将创建一个新项。如果项目确实存在,它将委托给
putItem
,然后将完全替换现有项目。主键在DynamoDB中是唯一的,因此没有两个项目可以具有相同的主键。我看不出这段代码有任何错误,我已经找到了答案。在这里,我的主键不是唯一的,所以当combine primary+sortKey时,它就工作了。这是我今天学到的新行为。谢谢你的建议。这对于
PutItem
来说是正确的,但我现在使用的是
Put
。在这里,嗯,我不确定我是否注意到了区别。
Put
API说“通过委托给
AWS.DynamoDB.putItem()
,创建一个新项,或者用一个新项替换一个旧项”。我不知道你的主键是什么样子,但也许这就是这里发生的事情。DynamoDB认为您正在操作一个旧项目,并将其委托给putItem。你期待什么样的行为?我假设您希望使用
put
操作创建(而不是更新)记录。这个假设正确吗?是的。这就是预期。如果您正在对DynamoDB中已经存在的项执行
put
操作,则客户端的行为符合预期<如果不存在具有该主键的项,则代码>放置将创建一个新项。如果项目确实存在,它将委托给
putItem
,然后将完全替换现有项目。主键在DynamoDB中是唯一的,因此没有两个项目可以具有相同的主键。我看不出这段代码有任何错误,我已经找到了答案。在这里,我的主键不是唯一的,所以当combine primary+sortKey时,它就工作了。这是我今天学到的新行为。谢谢你的建议。