Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

412
Vistas
¿Se puede usar s3.getObject o s3.putObject en el bloque Promise.then()?

Necesito probar si existe un objeto en un depósito S3, si es así, necesito descargar el objeto y, si no, crear el objeto. Mi código se parece a lo siguiente:

 let params = { Bucket: bucket, Key: fileName, }; const function async () => { await s3.headObject(params).promise() .then(() => { s3.getObject(params) .promise() .then(response => { console.log(response.Body.toISOString()); }); }) .catch((err) => { if (err.code == "NotFound") { s3.putObject({ Body: event, Bucket: bucket, Key: fileName, }); } }); }

No parece funcionar, el problema podría ser anidar una llamada s3.getObject o s3.putObject dentro de un bloque then o catch. Intenté anteponer esperar antes de s3.getObject/s3.putObject, pero aún no es bueno.

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Debe devolver las promesas anidadas desde sus .then() para que las promesas se encadenen correctamente. Pero, si va a usar async/await , es mejor ni siquiera usar .then() y solo usar await sin anidar. En general, no desea mezclar await y .then() ya que complica el flujo adecuado y el manejo de errores.

Aquí hay una versión en la que solo usa await y todas las promesas están secuenciadas correctamente:

 const params = { Bucket: bucket, Key: fileName, }; async function someFunction() { try { await s3.headObject(params).promise(); let response = await s3.getObject(params).promise(); console.log(response.Body.toISOString()); return response.Body; } catch (err) { if (err.code == "NotFound") { await s3.putObject({ Body: event, Bucket: bucket, Key: fileName, }).promise(); } else { throw err; } } }

Para su información, parece que podría/debería deshacerse de la parte headObject() de su función. Parece que todo lo que está haciendo es verificar si el objeto existe y getObject() ya debería hacer lo mismo. Entonces, solo maneje los errores correctamente en getObject() y puede eliminar el headObject() de esta manera:

 const params = { Bucket: bucket, Key: fileName, }; async function someFunction() { try { let response = await s3.getObject(params).promise(); console.log(response.Body.toISOString()); return response.Body; } catch (err) { if (err.code == "NotFound") { await s3.putObject({ Body: event, Bucket: bucket, Key: fileName, }).promise(); } else { throw err; } } }

Nota: Este código está sujeto a condiciones de carrera si dos fragmentos de código intentan agregar un objeto con la misma clave al mismo tiempo. Esto se debe a que hay una ventana de condición de carrera entre el momento en que verifica la existencia del objeto y el momento en que lo agrega, donde otro hilo de código podría agregar el objeto que luego sobrescribiría o terminaría con duplicados (dependiendo de cómo esté el almacén de datos). configurado). Su código para verificar si existe y luego agregarlo si no es atómico.

Este es un error/error clásico del almacén de datos. No conozco la API s3 en detalle, pero en general, debe configurar el almacén de datos para que solo se permita un objeto con una clave dada y solo intente agregar el nuevo objeto y si ya existe con el mismo key, simplemente recibe un error de que ya existe o usa una función atómica específica en el almacén de datos para agregarlo si aún no existe.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda