Express.js et multer: comment savoir quand les fichiers sont téléchargés?

J'utilise le module Multer pour les téléchargements de fichiers. Bien que cela fonctionne bien, il y a un avertissement à la fin de leur page Github, qui se lit comme suit: "AVERTISSEMENT: la requête est entièrement analysée après la fin des téléchargements de fichiers. L'accès à la requête prématurément peut entraîner des erreurs".

Cela m'a vraiment inquiété. Je ne peux pas trouver un moyen de laisser le middleware .post savoir quand les fichiers ont été téléchargés et le corps requis est prêt à l'emploi. Voici mon code:

App.js:

app.use(multer({ dest: './uploads/', rename: function (fieldname, filename) { return filename.replace(/\W+/g, '-').toLowerCase() + Date.now(); }, putSingleFilesInArray: true }) ); 

Upload.js:

 router.route('/') .get(function(req, res){ res.render('uploads'); }) .post(function(req, res){ //how to wait here for the file to upload? }); 

Bien que je sois informé de onParseEnd, mais je ne sais pas comment le mettre en œuvre, de sorte que j'ai au moins des informations sur le processus de téléchargement terminé.

Multer fait partie du routeur chanin. Cela signifie que express s'exécutera en premier, et une fois que multer a complété l'analyse, le formulaire continuera et passera l'exécution à votre gestionnaire .post (). L'avertissement sur la page est destiné à accéder à la requête chez les répondeurs multiples, comme onFileUploadData () et similaire. Par conséquent, l'ordre d'exécution est:

  • OnParseStart
  • OnFileUploadStart / onFileUploadData …
  • OnFileUploadComplete
  • OnParseEnd
  • Votre gestionnaire .post ()

Si je comprends correctement la documentation, l'avertissement ne s'applique qu'aux gestionnaires d'événements que vous pouvez transmettre à multer lui-même. Lorsque la demande arrive à votre manipulateur, multer est déjà terminé et tous les fichiers sont déjà téléchargés.

Le problème existe par exemple dans l'événement rename que vous utilisez déjà, mais cette fonction reçoit réellement quatre arguments fieldname, filename, req, res . Cela signifie que vous avez accès à la requête avant qu'elle ne soit complètement analysée.

Vous pouvez le connaître facilement, il existe une option disponible en plus

  • OnFileUploadComplete (fichier, req, res)

Vous pouvez utiliser ceci et envoyer une réponse à partir d'ici.

https://github.com/expressjs/multer#options

  app.use(multer({ dest: path.join(__dirname, '../uploads/fullsize'), rename: function (fieldname, filename) { return filename.replace(/\W+/g, '-').toLowerCase(); }, onFileUploadStart: function (file) { console.log(file.name + ' is starting ...'); }, onFileUploadComplete: function (file, req, res) { console.log(file.name + ' uploading is ended ...'); console.log("File name : "+ file.name +"\n"+ "FilePath: "+ file.path) }, onError: function (error, next) { console.log("File uploading error: => "+error) next(error) } onFileSizeLimit: function (file) { console.log('Failed: ', file.originalname +" in path: "+file.path) fs.unlink(path.join(__dirname, '../tmpUploads/') + file.path) // delete the partially written file } }));