Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec Multer sur le cours Node

Erreur sur le format de requête et absence de req.file

Sujet résolu
    5 mars 2024 à 15:15:27

    Hello, je suis actuellement le cours "Passez au Full Stack avec Node.js, Express et MongoDB" et j'en suis à l'étape "Modifiez les routes pour prendre en compte les fichiers".

    Dans le fichier controllers/stuff.js on met à jour la fonction createThing dans laquelle on doit parser la requête qui est passée au préalable par Multer qui est censé la stringifier (d'après ce que dit le cours). Sauf que la partie de la requête qu'on est censée parser dans le cours (req.body.thing) est undefined, et d'ailleurs le JSON n'est pas stringifié comme il devrait l'être. J'ai essayé de simplement utiliser req.body car j'ai à priori toutes les information à cet endroit, sauf que quelques lignes plus bas, la partie censée me donner le nom du fichier (req.filename) est undefined également. J'ai revu les parties précédentes pour voir ce que j'aurais pu rater, mais je ne trouve rien. J'ai pas trouvé de réponse non plus sur le forum.

    J'ai l'impression que la requête ne passe pas par multer ou qu'il ne fait pas son travail. Pourtant un console.log de multer dans routes/stuff.js m'indique bien que c'est un middleware. Lorsque je fais un console.log dans un callback de la méthode diskStorage de multer, je ne le vois pas lorsque je fais un POST.

    Voici mon code pour les fichiers concernés :


    //middlewares/multer-config.js
    
    const multer = require('multer');
    
    const MIME_TYPES = {
      'image/jpg': 'jpg',
      'image/jpeg': 'jpg',
      'image/png': 'png'
    };
    
    const storage = multer.diskStorage({
      destination: (req, file, callback) => {
        callback(null, 'images');
      },
      filename: (req, file, callback) => {
        const name = file.originalname.split(' ').join('_');
        const extension = MIME_TYPES[file.mimetype];
        console.log('name : ', name + Date.now() + '.' + extension)
        callback(null, name + Date.now() + '.' + extension);
      }
    });
    
    module.exports = multer({storage: storage}).single('image');
    //routes/stuff.js
    
    const express = require('express');
    const router = express.Router();
    
    const auth = require('../middlewares/auth');
    const multer = require('../middlewares/multer-config');
    
    const stuffCtrl = require('../controllers/stuff');
    
    router.get('/', auth, stuffCtrl.getAllThings);
    router.post('/', auth, multer, stuffCtrl.createThing);
    router.get('/:id', auth, stuffCtrl.getOneThing);
    router.put('/:id', auth, stuffCtrl.modifyThing);
    router.delete('/:id', auth, stuffCtrl.deleteThing);
    
    module.exports = router;
    //controllers/stuff.js
    
    const Thing = require('../models/Thing');
    
    exports.createThing = (req, res, next) => {
        const thingObject = JSON.parse(req.body.thing); //ERREUR : req.body.thing est undefined
        delete thingObject._id;
        delete thingObject._userId;
        const thing = new Thing({
            ...thingObject,
            userId: req.auth.userId,
            imageUrl: `${req.protocol}://${req.get('host')}/images/${req.file.filename}`//ERREUR : req.file est undefined
        });
        thing.save()
        .then(() => { res.status(201).json({message: 'Objet enregistré !'})})
        .catch(error => { res.status(400).json( { error })})
     };
    
    exports.getAllThings = (req, res, next) => {
        Thing.find()
            .then(things => res.status(200).json(things))
            .catch(error => res.status(400).json({error}));
    };
    
    exports.getOneThing = (req, res, next) => {
        Thing.findOne({_id: req.params.id})
            .then(thing => res.status(200).json(thing))
            .catch(error => res.status(404).json({error}));
    };
    
    exports.modifyThing = (req, res, next) => {
        Thing.updateOne({_id: req.params.id}, {...req.body, _id: req.params.id})
            .then(() => res.status(200).json({message: 'Objet modifié'}))
            .catch(error => res.status(400).json({error}));
    };
    
    exports.deleteThing = (req, res, next) => {
        Thing.deleteOne({_id: req.params.id})
            .then(() => res.status(200).json({message: 'Objet supprimé'}))
            .catch(error => res.status(400).json({error}));
    };



    Merci d'avance

    EDIT : Résolu => J'avais simplement raté l'encart qui expliquait qu'il fallait passer dans la partie 4 du front-end.


    -
    Edité par mehdibrillaud 15 mars 2024 à 13:01:37

    • Partager sur Facebook
    • Partager sur Twitter

    Problème avec Multer sur le cours Node

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    • Editeur
    • Markdown