Je suis en difficulté à trouver une solution pour télécharger deux fichiers à S3. Je peux télécharger un fichier avec Multer et j'ai appris à le faire, mais lorsque j'essaie de faire une carte à l'intérieur de tous les fichiers de la formdata et de télécharger chaque fichier, je apporte dans un tableau chaque URL de l'emplacement qui est celui que je sauve ma base de données. Ensuite, j'essaie d'imprimer chaque URL mais pour ma surprise, ils sont imprimés à l'intérieur de la déclaration IF mais pas lorsque je l'enregistrez dans la base de données en dehors du si. Pourrait-il être pour un problème asymétrique ?. Merci.
tournamentsCtrl.createTournament = async (req, res) => { var files_upload = [] if (req.files) { aws.config.setPromisesDependency(); aws.config.update({ accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, //region: process.env.REGION }); const s3 = new aws.S3(); req.files.map((item) => { var params = { ACL: 'public-read', Bucket: process.env.AWS_BUCKET_NAME, Body: fs.createReadStream(item.path), Key: `tournament_img/${uuidv4()/* +req.file.originalname */}` }; await s3.upload(params, (err, data) => { if (err) { console.log('Error occured while trying to upload to S3 bucket', err); } if (data) { fs.unlinkSync(item.path); // Empty temp folder const locationUrl = data.Location; files_upload.push(locationUrl); console.log(files_upload) } }); }); } console.log(files_upload) const new_data = { ...JSON.parse(req.body.values), img_source: files_upload[0], info_url: files_upload[1] } console.log(new_data) const newUser = new Tournaments(new_data); newUser .save() .then(user => { res.json({ message: 'User created successfully', user }); }) .catch(err => { console.log('Error occured while trying to save to DB'); }); };
3 Réponses :
Si vous regardez les docs pour Télécharger < / a> Cela ne renvoie pas une promesse, vous ne devriez donc pas vous attendre. La méthode de la carte par défaut n'est pas compatible avec le code ASYNC dans ce formulaire. Vous devez soit utiliser ASYNC.MAP ou envelopper le code ASYNC dans Une promesse comme Votre autre code a également des problèmes. Une fonction de carte doit renvoyer une valeur. Si vous ne voulez rien retourner, vous devez utiliser pour utiliser. P> p>
Merci pour votre réponse. J'ai essayé de le résoudre mais cela a été impossible. Pourriez-vous m'aider? Merci.
J'ai essayé de résoudre le problème mais je ne suis pas capable de le faire :( Ceci est mon nouveau code.
tournamentsCtrl.createTournament = async (req, res) => { aws.config.setPromisesDependency(); aws.config.update({ accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, //region: process.env.REGION }); const s3 = new aws.S3(); var files_upload = {}; let promiseList = new Promise(function (resolve, reject) { req.files.forEach(element => { if (element.fieldname.includes('img')) { var folder = 'club_images' } else if (element.fieldname.inlcudes('poster')) { var folder = 'poster_tournament' } else { var folder = 'info_tournament' } var params = { ACL: 'public-read', Bucket: process.env.AWS_BUCKET_NAME, Body: fs.createReadStream(element.path), Key: `${folder + '/' + uuidv4() + element.fieldname}` }; s3.upload(params, (err, data) => { if (err) { console.log('Error occured while trying to upload to S3 bucket', err); } if (data) { fs.unlinkSync(element.path); // Empty temp folder const locationUrl = data.Location; files_upload[element.fieldname] = locationUrl; console.log(files_upload); } }); }); resolve(files_upload) }) Promise.all([promiseList]).then(() => { console.log(Object.assign(JSON.parse(req.body.values), files_upload)); const newUser = new Tournaments(Object.assign(JSON.parse(req.body.values), files_upload)); console.log(newUser) newUser .save() .then(user => { res.json({ message: 'User created successfully', user }); }) .catch(err => { console.log('Error occured while trying to save to DB'); }); }) };
C'est un mauvais endroit pour demander conseil au code, mais quelque chose comme le suivant
function uploadFile(s3, element) { return new Promise((resolve, reject) => { let folder; if (element.fieldname.includes('img')) { folder = 'club_images' } else if (element.fieldname.inlcudes('poster')) { folder = 'poster_tournament' } else { folder = 'info_tournament' } const params = { ACL: 'public-read', Bucket: process.env.AWS_BUCKET_NAME, Body: fs.createReadStream(element.path), Key: `${folder + '/' + uuidv4() + element.fieldname}` }; s3.upload(params, (err, data) => { if (err) { return reject(err); } if (data) { return fs.unlink(element.path, err=> { if(err) { console.error("Failed to unlink file", element.path); } return resolve({[element.fieldname]: data.Location}); }); // Empty temp folder } return resolve(); }); }) } tournamentsCtrl.createTournament = async (req, res) => { aws.config.setPromisesDependency(); aws.config.update({ accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, //region: process.env.REGION }); const s3 = new aws.S3(); try { const uploadData = await Promise.all(req.files.map(element => uploadFile(s3, element))); const returnData = Object.assign({}, ...uploadData); console.log(Object.assign(JSON.parse(req.body.values), returnData)); } catch(e) { console.error('Failed to upload file', e); return res.sendStatus(500); } const newUser = new Tournaments(Object.assign(JSON.parse(req.body.values), files_upload)); console.log(newUser) try { const user = await newUser.save() res.json({message: 'User created successfully', user}); } catch(e) { console.error('Error occured while trying to save to DB'); return res.sendStatus(500); } };