我尝试使用适用于 JS 的 AWS 开发工具包将 DynamoDB 项目的 String 类型属性 Password 设置为整数的字符串表示形式。这是我最初的方法:
import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
import {
UpdateCommand,
DynamoDBDocumentClient,
} from '@aws-sdk/lib-dynamodb';
const dynamoClient = new DynamoDBClient({
credentials: {
accessKeyId: process.env.MY_AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.MY_AWS_SECRET_ACCESS_KEY,
},
region: 'us-east-2',
});
const dynamoDocClient = DynamoDBDocumentClient.from(dynamoClient);
const key = { Email: [email protected] };
dynamoInput.Key = key;
const attr = 'Password';
const attrVal = 456789;
dynamoInput.UpdateExpression = `SET ${attr} = ${attrVal}`;
dynamoDocClient.send(new UpdateCommand(dynamoInput));
但这会产生错误
ValidationException: Invalid UpdateExpression: Syntax error; token: "456789", near: "= 456789"
。我认为问题可能是我将 String 类型的属性设置为整数,而不是该整数的字符串表示形式。因此,我尝试在更新表达式中将整数 456789 用各种引号括起来。但显然,直接包含在更新表达式中的引用标记在语法上也是非法的。这导致我求助于使用表达式属性值作为我的字符串表示的占位符。
const attr = 'Password';
const attrVal = 456789;
dynamoInput.ExpressionAttributeValues = { ':v': `${attrVal}` };
dynamoInput.UpdateExpression = `SET ${attr} = :v`;
但这又给了我另一个错误:
ValidationException: The provided key element does not match the schema
。
DocumentClient 没有做任何特殊的事情,它只是设置从 JavaScript 变量推断的值。
const attr = 'Password';
const attrVal = "456789";
dynamoInput.ExpressionAttributeValues = { ':v': attrVal };
dynamoInput.ExpressionAttributeNames={"#p":attr}
dynamoInput.UpdateExpression = "SET #p = :v";