Creé una función dentro de mi ruta que cargará todas las imágenes en la biblioteca de terceros de Cloudinary y devolverá todos los enlaces de URL, y estoy presionando todos los enlaces en mi variable de URL y luego los enlaces se almacenarán en la base de datos.
Quiero hasta que los enlaces estén disponibles en mi variable de URL, no se insertará en mi base de datos. Estoy confundido acerca de cómo puedo hacerlo usando async/await o usando promesas
Esta es mi ruta con función. Estoy usando node, express, multer.
app.post('/addProduct', async (req, res, next) => { let urls = []; async function sendImagesToCloudinary() { for (let file of req.files) { await cloudinary.uploader.upload( file.path, { public_id: `${Date.now()}`, resource_type: 'auto' } ).then(result => { //del files after upload on cloudinary fs.unlink(file.path, function (err) { if (err) { console.log(err); } }); urls.push(result.url); }) .catch(err => { console.log(err); }); } res.json(urls); } sendImagesToCloudinary(); // Publish on database const result = await unityMartMediaCollection.insertOne({ urls: urls }) res.json(result) });Vale la pena (a) separar las diversas operaciones asíncronas en funciones más pequeñas, más claras y comprobables, y (b) utilizar solo un estilo de sintaxis de promesa...
// isolated version of he OP upload async function upload(file) { const params = { public_id: `${Date.now()}`, resource_type: 'auto' } return cloudinary.uploader.upload(file.path, params); } // this promisify's fs.unlink (probably natively available in fs.promise) async unlink(file) { return new Promise((resolve, reject) => { fs.unlink(file.path, error => error? reject(error) : resolve()); }); } // upload, then unlink if upload succeeds, return the url upload result // catch errors here, so other concurrent uploads can continue async uploadAndUnlink(file) { try { const url = await upload(file); await unlink(file); return url } catch (err) { console.log(err); } } // implement the route, process the files concurrently app.post('/addProduct', async (req, res, next) => { const promises = req.files.map(file => uploadAndUnlink(file)); const urls = await Promise.all(promises); const result = await unityMartMediaCollection.insertOne({ urls: urls }) res.json(result); }); Me tomé la libertad de eliminar la invocación .json en res dentro del método de producción de URL. La fuerte implicación del resto del código es que el objetivo es devolver (al cliente) el resultado de la llamada a unityMartMediaCollection .