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.

Nodejs AWS S3 createPresignedPost devuelve el error No se pueden leer las propiedades de undefined (leyendo ‘endsWith’)

Tengo el siguiente código:

const { S3Client } = require('@aws-sdk/client-s3');
const { createPresignedPost } = require('@aws-sdk/s3-presigned-post');

router.post(
  '/sign-s3', async (req, res, next) => {
    const { name, type } = req.body;
    const client = new S3Client({
      region: 'eu-central-1',
      credentials: {
        accessKeyId: process.env.AWS_ACCESS_KEY_ID,
        secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
      },
    });
    const params = {
      Bucket: process.env.S3_BUCKET_NAME,
      Expires: 60,
      Conditions: [
        ['content-length-range', 100, 5242880],
        { 'Content-Type': 'image/jpeg' },
      ],
      Fields: {
        key: <code>blog/${name}</code>,
        'Content-Type': type,
        success_action_status: '201',
      },
    };
    try {
      const data = await createPresignedPost(client, params);
      return res.json(data);
    } catch (err) {
      return next({ status: 500, message: err.message });
    }
  }
);

Esta ruta devuelve el siguiente error:
No se pueden leer las propiedades de undefined (leyendo ‘endsWith’)

Este error no es muy útil. Intenté pasar las credenciales directamente en la configuración del objeto S3Client porque tenía problemas con el SDK V2 al no leer automáticamente las credenciales de .env (la documentación asegura que debería hacerlo), pero eso no ayudó. Ejecuté estos parámetros con V2 y funcionó perfectamente, así que estoy seguro de que no son el problema aquí. ¿Alguna idea?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el mensaje de error “Cannot read properties of undefined (reading ‘endsWith’)” no está relacionado con el fragmento de código proporcionado. El código se ve bien y no parece haber errores de sintaxis o problemas lógicos.

    Sin embargo, una posible solución al problema de que las credenciales de AWS no se lean del archivo .env podría ser utilizar el paquete dotenv. Este paquete permite cargar variables de entorno desde un archivo .env en process.env.

    Para usar dotenv, se pueden seguir estos pasos:
    1. Instalar el paquete utilizando npm: npm install dotenv
    2. Crear un archivo .env en el directorio raíz del proyecto y agregar las credenciales de AWS de la siguiente manera:

    AWS_ACCESS_KEY_ID=tu_access_key_id
    AWS_SECRET_ACCESS_KEY=tu_secret_access_key
    
    1. Incluir la siguiente línea de código en la parte superior del archivo donde se utiliza el SDK de AWS:
    require('dotenv').config();
    
    1. Modificar la configuración del S3Client para eliminar el bloque de credenciales:
    const client = new S3Client({
      region: 'eu-central-1',
    });
    

    Esto debería cargar las credenciales de AWS desde el archivo .env y permitir que el SDK se autentique correctamente.

    Si el problema persiste, podría estar relacionado con una parte diferente del código o con la configuración del entorno. Puede ser necesario realizar más pruebas para identificar la causa raíz.

Comments are closed.