Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

410
Views
¿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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!