Estoy tratando de detectar un error en las funciones asíncronas anidadas para hacer una reversión si hay un error.
Así que tengo mi primer intento de captura, luego dentro llamo a una función que llama a otra función, la última función debería arrojar un error, pensé que el primer bloque de intento atraparía el error de lanzamiento, pero no lo hace. Este es mi código:
La función con el primer intento/captura:
exports.add = (req, res) => { const { product, type } = req.body try { switch (type) { case ProductsTypes.TRACK: addTrack(product, req.files) res.status(200).json({ message: 'SUCCESS !' }) break default: res.status(400).json({ message: 'INVALID TYPE !' }) } } catch (error) { // ROLLBACK HERE res.status(400).json({ message: "Error Exception, Need to rollback", error }) } }La función en la que pensé en detectar el error para devolverlo a la parte superior
const addTrack = (product, files) => { const imageFile = files[NamesAddTrackForm.TRACK_IMAGE][0] const audioFile = files[NamesAddTrackForm.TRACK_AUDIO][0] const stemsZip = files[NamesAddTrackForm.TRACK_STEMS][0] FilesFormater.resizeImage(imageFile, 500, 500) // I thought this function throw an exception }La función donde tiro el error:
resizeImage = (file, width, height) => { try { sharp(file.path) .resize(width, height) .jpeg({ quality: 90 }) .toBuffer((err, buffer) => { fs.writeFileSync(file.path, buffe, (err) => { // I simulate an error here (buffe) instead (buffer) if (!err) { throw Error(err) } }) }) } catch (error) { throw Error(error) } }Me gustaría saber cómo poder manejar este tipo de errores para devolverlo al primero, porque me gustaría usar esta lógica en mis otros archivos para revertir acciones como insertar en la base de datos o crear archivos. , si aparece un error durante el procesamiento del código, porque de lo contrario termino con datos ilógicos
Debe hacer resizeImage para devolver una promesa si desea detectar el error de una operación asincrónica.
Además, debe agregar la palabra clave async en la función, para que pueda usar await .
Puede intentar lo siguiente: (Código no probado).
const fs = require("fs").promises; class FilesFormater { static resizeImage = async (file, width, height) => { try { const { data } = await sharp(file.path) .resize(width, height) .jpeg({ quality: 90 }) .toBuffer(); await fs.writeFile(file.path, data); } catch (error) { throw new Error(error); } }; } const addTrack = (product, files) => { const imageFile = files[NamesAddTrackForm.TRACK_IMAGE][0]; const audioFile = files[NamesAddTrackForm.TRACK_AUDIO][0]; const stemsZip = files[NamesAddTrackForm.TRACK_STEMS][0]; return FilesFormater.resizeImage(imageFile, 500, 500); // a Promise is return. }; exports.add = async (req, res) => { const { product, type } = req.body; try { switch (type) { case ProductsTypes.TRACK: await addTrack(product, req.files); // await the Promise res.status(200).json({ message: "SUCCESS !" }); break; default: res.status(400).json({ message: "INVALID TYPE !" }); } } catch (error) { // ROLLBACK HERE res.status(400).json({ message: "Error Exception, Need to rollback", error, }); } };