web-dev-qa-db-fra.com

Node.js (avec express & bodyParser): impossible d'obtenir les données de formulaire à partir de la demande de publication

Je n'arrive pas à récupérer les données de formulaire d'une demande de publication envoyée à mon serveur Node.js. J'ai mis ci-dessous le code du serveur et la demande de publication (envoyée à l'aide de postman en chrome):

Post demande

POST /api/login HTTP/1.1
Host: localhost:8080
Cache-Control: no-cache

----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="userName"

jem
----WebKitFormBoundaryE19zNvXGzXaLvS5C

code serveur NodeJS

var express    = require('express');        // call express
var app        = express();                 // define our app using express
var bodyParser = require('body-parser');

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

app.all('/*', function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Headers', 'Content-Type,accept,access_token,X-Requested-With');
    next();
});

var port = process.env.PORT || 8080;        // set our port

var router = express.Router();              // get an instance of the express Router

router.get('/', function(req, res) {

    res.json({ message: 'I am groot!' });   
});

// Login
router.route('/login')

    .post(function(req, res){

        console.log('Auth request recieved');

        // Get the user name
        var user = req.body.userName;

        var aToken = getToken(user);

        res.json({

            'token':'a_token'
        });
    });

app.use('/api', router);

app.listen(port);

La méthode de connexion essaie d'obtenir le req.body.userName, toutefois, req.body est toujours vide. J'ai vu d'autres cas sur SO décrivant un tel comportement mais aucune des réponses associées ne s'appliquait ici.

Merci d'avoir aidé.

28
Jem

En général, une application express doit spécifier le middleware de l'analyseur de corps approprié pour que req.body Contienne le corps.

[ÉDITÉ]

  1. Si vous avez besoin d'analyser les données de formulaire encodées en url (non multiparties), ainsi que JSON, essayez d'ajouter:

    // Put this statement near the top of your module
    var bodyParser = require('body-parser');
    
    
    // Put these statements before you define any routes.
    app.use(bodyParser.urlencoded());
    app.use(bodyParser.json());
    

    Tout d'abord, vous devrez ajouter body-parser à la propriété dependencies de votre package.json, Puis effectuer un npm update.

  2. Pour gérer les données de formulaire en plusieurs parties, l'analyseur de corps bodyParser.urlencoded() ne fonctionnera pas. Voir modules suggérés ici pour analyser les corps en plusieurs parties.

26
cybersam

Pour gérer les requêtes multipart/form-data qui prennent en charge le téléchargement de fichiers, vous devez utiliser le module multer. lien npm pour le middleware multer

4
Sanjeev Kumar

Assurez-vous de mettre dans cet ordre: bodyParser.json () en premier. app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true }));

1
Aecio Levy