Tengo un servidor node.js que descarga imágenes de mi depósito s3 y entrega las imágenes a mi cliente React. Quiero administrar el caso cuando se envía la clave de archivo incorrecta al cliente S3. Para hacerlo, estoy enviando intencionalmente una clave incorrecta desde React. Espero recibir un error que pueda detectar y representar mi vista en consecuencia. Desafortunadamente, la API s3 no devuelve un error, por lo que todos los puntos de mi código en los que tengo la intención de detectar el error se están pasando y no puedo mostrar una vista cuando obtengo la imagen y otra vista cuando recibo un error.
Mi código se ve así:
//s3Connect.js download: async (fileKey)=>{ const downloadParams={ Key:fileKey, //this is a wrong key like 123 or anything Bucket:bucketName } const data = s3.getSignedUrlPromise('getObject', downloadParams); return data } //adminPanel.js //I call the above function below getBackgroundCheck:async (req,res)=>{ const readStream = await s3.download(req.params.key).then(url=> { console.log(url) res.send({url}) }) .catch(error=>{ console.log(error) res.send('the error is',error) //since I sent a wrong key I expect to catch an error here } ) }Ahora en el lado del cliente. Uso React y el método fetch para recuperar la imagen.
const getBackgroundFile = async (e) => { try { e.preventDefault() const response = await fetch(`http://localhost:3003/adminPanel/getbackgroundcheck/${id}`) console.log('this is the response ',response) const parseResponse = await response.json() console.log('this is the parseResponse', parseResponse) setImage(parseResponse) setShowBackImage(true) } catch (error) { console.log('this is the error',error) //again I expect to see this in console } }Finalmente: ¿Qué obtengo con console.logs de la función anterior?
this is the response Response {type: 'cors', url: 'http://localhost:3003/adminPanel/getbackgroundcheck/nll%C3%B1', redirected: false, status: 200, ok: true, …}Entonces, como puede ver, tengo un estado de 200. Entonces, ¿cómo puedo manejar un error si obtengo un estado 200 ok cuando sé que la respuesta falló porque mi servidor no pudo encontrar la imagen en el depósito s3 y entregársela a mi cliente?
La creación de una URL prefirmada es una operación que no puede fallar en el funcionamiento normal. No hay una llamada de API real detrás de la creación de una URL prefirmada: es un simple ejercicio de firma local en el SDK. Felizmente generará URL prefirmadas para objetos que no existen, por ejemplo.
Si no desea detectar URL de venta para objetos S3 inexistentes, tendrá que hacerlo de otra manera. Por ejemplo, enviando las descargas por proxy o empujando la responsabilidad al cliente.