web-dev-qa-db-fra.com

Node.js, multer et req.body empty

Voilà mon problème, j'ai un formulaire où je peux insérer un fichier et un champ mais je ne reçois que le fichier et pas le paramètre test! Pourquoi?

Voici mon code:

app.js:

var express = require('express');
var bodyParser = require('body-parser');
var app = express();
var port = 8000;
var multer = require('multer'); // v1.0.5
var storage =   multer.diskStorage({
  destination: function (req, file, callback) {
    callback(null, './uploads');
  },
  filename: function (req, file, callback) {
    callback(null, file.originalname.substring(0,file.originalname.lastIndexOf('.')) + '-' + Date.now() + file.originalname.substring(file.originalname.lastIndexOf('.'),file.originalname.length));
  }
});
var upload = multer({ storage : storage}).single('fileUpload');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));

app.post('/api/upload',function(req,res){
    console.log(req.body);
    upload(req,res,function(err) {
        if(err) {
            return res.end("Error uploading file.");
        }
        res.end("File is uploaded");
    });
});

app.listen(port, function () {
    console.log('Express server inizializzato sulla porta ' + port);
});

index.html:

<html>
    <head>
        <title>Test upload</title>
    </head>
    <body>
        <form name="form" action="http://localhost:8000/api/upload" method="post" enctype="multipart/form-data">
            <input type="text" name="test" />
            <input type="file" name="fileUpload" />
            <input type="submit" value="invia" />
        </form>
    </body>
</html>

Quelqu'un peut m'aider?

17
Filippo1980

Mise à jour 2017

à partir du fichier Lisezmoi

Notez que req.body n'est peut-être pas encore entièrement rempli. Cela dépend de l'ordre dans lequel le client transmet les champs et les fichiers au serveur.

J'ai résolu mon problème en inversant l'ordre de mes propriétés d'objet de formulaire dans le frontal:

    var newFormObj  = new FormData();
    newFormObj.append('internalUserID', internalUserID);
    newFormObj.append('listingImage', this.binaryImages[image]);

Sur le backend:

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    console.log(req.body.internalUserID) // YAY, IT'S POPULATED
    cb(null, 'listing-pics/')
  },                    
  filename: function (req, file, cb) {
    cb(null, file.fieldname + '-' + Date.now())
  }                     
});                     

var upload = multer({ storage: storage });
38
dman

Je décide de déménager req.body à la fin de la fonction de post:

app.post('/api/upload?:test',function(req,res){

    upload(req,res,function(err) {
        if(err) {
            return res.end("Error uploading file.");
        }
        res.end("File is uploaded");
    console.log(req.body);

    });
});

Si quelqu'un peut me dire pourquoi je serai heureux d'apprendre une nouvelle chose! Mais, pour l'instant, j'ai résolu!

8
Filippo1980