es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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

Tags:  , ,

Answer

  1. Avatar for 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 atributo price 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:

    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: 'SET #pl = list_append(#pl, :vals)',
        ExpressionAttributeNames: {
          '#pl': 'plans',
        },
        ExpressionAttributeValues: {
          ':vals': [
            {
              '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')
    }
    

    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 Lista plans existente.

    El ExpressionAttributeValues también se ha actualizado para incluir los atributos id, name, category y price 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 Lista plans existente, tal como se muestra en la captura de pantalla de la documentación de AWS que incluiste.

Comments are closed.