¿Cómo agrego datos de lista anidada en dynamodb utilizando la pila sin servidor?
Tengo una tabla de dynamoDB que tiene un elemento que incluye un usuario y una lista de planes. Se ve así:
Item:
{
user: 'abc123',
plans: [
{
id: 1,
name: 'movies',
category: 'category',
price: 200,
},
{
id: 2,
name: 'fishing',
category: 'category2',
price: 400,
}
]
}
Ahora, quiero agregar otro plan. Entonces escribí el siguiente controlador. Y hay un error add error ValidationException: Invalid UpdateExpression: An expression attribute value used in expression is not defined; attribute value: :price
en CloudWatch.
export const processAddPlan = async (event:APIGatewayEvent) => {
const data = JSON.parse(event.body)
const { store, id } = event.queryStringParameters
const params = {
TableName: usersTable,
Key: {
store: store,
id: id,
},
UpdateExpression: 'ADD #pl :plans, id :id, name :name, category :category, price :price',
ExpressionAttributeNames: {
'#pl' : 'plans',
},
ExpressionAttributeValues: {
':plans': [
{
':id': uuid.v4(),
':name': data.planName,
':category': data.planCategory,
':price': data.planPrice,
},
],
},
ReturnValues: 'ALL_NEW',
}
log.info('params', params)
await dynamoDb.update(params).catch(e => log.info('add error', e))
return success('add plan succeeded')
}
Configuré los parámetros de consulta y probé (envié) a través de Postman de esta manera.
{
"plans":[
{"planName":"ga",
"planCategory": "tt",
"planPrice": 567
}
]
}
Me referí a “Adding Elements to a Set”. https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html
davy.ai
El error
add error ValidationException: Invalid UpdateExpression: An expression attribute value used in expression is not defined; attribute value: :price
indica que el atributoprice
no está definido en UpdateExpression o ExpressionAttributeValues, pero se está utilizando.Para solucionar este error, debes actualizar el UpdateExpression y ExpressionAttributeValues para incluir correctamente la nueva información del plan.
Aquí tienes un código de controlador actualizado que debería funcionar:
En este código actualizado, el UpdateExpression se ha cambiado a
SET #pl = list_append (#pl, :vals)
, que agrega la nueva información del plan a la Listaplans
existente.El ExpressionAttributeValues también se ha actualizado para incluir los atributos
id
,name
,category
yprice
para el nuevo plan, y se ha utilizado el marcador de posición:vals
en el UpdateExpression para hacer referencia a estos valores.Ten en cuenta que la función
list_append
se utiliza en el UpdateExpression para agregar a la Listaplans
existente, tal como se muestra en la captura de pantalla de la documentación de AWS que incluiste.