Error Documentation - netfoor/AmplifyWorkshop-RetailStore GitHub Wiki

Error al Cargar Datos de Prueba con Amplify Gen 2: "Error loading products: undefined"

Síntoma

Al intentar cargar datos de prueba (por ejemplo, desde un archivo JSON) a un modelo de datos en AWS Amplify Gen 2 utilizando client.models.MyModel.create(), se recibe un error similar a:

Product data load status

Error loading products: undefined
There are N products for the RetailStore application

Aunque el número de productos (N) pueda parecer correcto o esperable, el mensaje Error loading products: undefined en lugar de un tipo de error específico como DynamoDB:ConditionalCheckFailedException es la clave del problema.

Causa Raíz

Este error undefined generalmente ocurre cuando los datos que intentas insertar contienen campos (propiedades) que no están definidos en el esquema GraphQL de tu modelo de datos en Amplify.

AWS AppSync (el servicio GraphQL subyacente que utiliza Amplify) valida estrictamente los datos de entrada contra el esquema. Si recibe propiedades que no reconoce en el input de una mutación create, rechaza la operación. La librería cliente de Amplify (o el método de manejo de errores específico en tu código) puede no capturar el errorType exacto para este tipo de validación, resultando en un undefined.

Ejemplo de Discrepancia Común:

  • En tu JSON de datos de prueba (products.json):
    {
      "id": "...",
      "name": "...",
      "gender_affinity": "F", // ¡Este campo existe en el JSON!
      "where_visible": "UI"   // ¡Este campo existe en el JSON!
      // ... otros campos
    }
    
  • En tu esquema GraphQL (amplify/data/resource.ts):
    Product: a
      .model({
        id: a.id().required(),
        name: a.string().required(),
        // ... otros campos como description, price, etc.
        // PERO FALTAN 'gender_affinity' y 'where_visible'
      })
    

Solución

Para resolver este problema, tienes dos enfoques principales, dependiendo de si necesitas o no los campos adicionales en tu aplicación:

  1. Eliminar los campos extra del JSON de datos de prueba:

    • Si los campos en el JSON que no están en el esquema no son necesarios para tu aplicación, simplemente remuévelos de tu archivo JSON de datos de prueba (products.json en este caso).
    • Este es el enfoque más rápido si los datos no son críticos.
  2. Añadir los campos faltantes a tu esquema GraphQL:

    • Si los campos extra en el JSON (gender_affinity, where_visible, etc.) sí son datos que tu aplicación necesita y utilizará, entonces debes actualizar tu modelo de datos en amplify/data/resource.ts para incluir esas propiedades.
    • Ejemplo:
      Product: a
        .model({
          id: a.id().required(),
          name: a.string().required(),
          description: a.string(),
          price: a.float(),
          current_stock: a.integer(),
          image: a.string(),
          rating: a.float(),
          style: a.string(),
          gender_affinity: a.string(), // ¡Añadido!
          where_visible: a.string(),   // ¡Añadido!
      
          // relationships
          categoryProductsId: a.id(),
          category: a.belongsTo('Category', 'categoryProductsId'),
        })
      
    • Después de modificar el esquema, asegúrate de desplegar tus cambios de backend ejecutando npx ampx sandbox (para desarrollo local) o npx ampx deploy (para entornos de despliegue). Esto actualizará tu API GraphQL y la tabla de DynamoDB para que reconozcan los nuevos campos.

Recomendación

La mejor práctica es que tus datos de prueba (.json) coincidan exactamente con el esquema GraphQL de tus modelos. Si necesitas los datos, actualiza el esquema. Si no los necesitas, límpialos del JSON.

Después de aplicar la solución, vuelve a ejecutar tu script de carga de datos. Si el problema era la discrepancia de esquema, la carga debería proceder sin el error undefined.