javascript - NUMBER_VALUE kan inte konverteras till Sträng när Item uppdateras
Jag har detta konstiga problem med DynamoDB där jag inte verkar kunna uppdatera ett objekt.
Här är min kommando:
TableName: 'UserTable',
Key: { UID: { S: 'h4XJj3YRxZiF7TDcGkxAhc' } },
UpdateExpression: 'SET numRatings = :numRatings',
ExpressionAttributeValues: { ':numRatings': { N: 336 } },
ReturnValues: 'UPDATED_NEW'
Jag har verifierat att tabellen är korrekt, och att nyckeln i tabellen UID faktiskt har hashen h4XJj3YRxZiF7TDcGkxAhc som värde. numRatings är för närvarande lika med 1.
Här är min kod:
const params = {
TableName: process.env.USER_TABLE_NAME!,
Key: {
UID: {
S: UID
}
},
UpdateExpression: 'SET numRatings = :numRatings',
ExpressionAttributeValues: {
':numRatings': { N: numRatings } as unknown as AttributeValue
},
ReturnValues: 'UPDATED_NEW'
} as UpdateItemCommandInput;
try {
const result = await dbClient.send(new UpdateItemCommand(params));
...
Ändå får jag detta fel: NUMBER_VALUE kan inte konverteras till String kanske jag är blind men jag kan inte se var denna konvertering kan ske.
Jag använder TypeScript och AWS-SDK 3.54.0
Om någon kan påpeka vad jag gör fel skulle jag vara mycket tacksam.
Svar #1
Enligt dokumentationen för AttributeValue:
Nummer skickas över nätverket till DynamoDB som strängar, för att maximera kompatibiliteten mellan språk och bibliotek. Däremot behandlar DynamoDB dem som attribut av typen nummer för matematiska operationer.
Så, eftersom du använder den låg-nivå DynamoDB-klienten, behöver du skicka numeriska värden som typen N men värdet måste vara en sträng:
':numRatings': { N: `${numRatings}` }
Om du använder den mer avancerade DocumentClient, som automatiskt utför marshalling av data mellan JavaScript-objekt och DynamoDB-attributvärden, kan du använda:
':numRatings': numRatings
