req.corps vide sur les poteaux

Tout à coup, cela arrive à tous mes projets.

Chaque fois que je fais un post dans nodejs en utilisant express et body-parser req.body est un objet vide.

var express    = require('express')
var bodyParser = require('body-parser')

var app = express()

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded())

// parse application/json
app.use(bodyParser.json())

app.listen(2000);

app.post("/", function (req, res) {
  console.log(req.body) // populated!
  res.send(200, req.body);
});

Via ajax et postman c'est toujours vide.

Cependant via curl

$ curl -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:2000/

Cela fonctionne comme prévu.

J'ai essayé de définir manuellement Content-type : application/json dans le premier mais je reçois toujours 400 bad request

Cela m'a rendu fou.

Je pensais que c'était quelque chose mis à jour dans body-parser mais je dégradé et il n'a pas aidé.

Toute aide appréciée, merci.

155
demandé sur Joseph Dailey 2014-07-03 06:03:56

14 réponses

Dans Postman des 3 options disponibles pour le type de contenu, sélectionnez "X-www-form-urlencoded" et cela devrait fonctionner.

Aussi pour se débarrasser du message d'erreur remplacer:

app.use(bodyParser.urlencoded())

Avec:

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

Voir https://github.com/expressjs/body-parser

Le middleware 'body-parser' gère uniquement les données JSON et urlencoded, pas multipart

179
répondu Mick Cullen 2014-07-03 16:10:23

Avec Postman, pour tester les actions POST HTTP avec une charge utile de données JSON brutes, sélectionnez l'option raw et définissez les paramètres d'en-tête suivants:

Content-Type: application/json

Assurez-vous également d'envelopper toutes les chaînes utilisées comme clés/valeurs dans votre charge utile JSON entre guillemets doubles.

Le body-parser package analysera très bien les charges utiles JSON brutes multi-lignes.

{
    "foo": "bar"
}

Testé en Chrome V37 et V41 avec L'extension Postman V0.8.4.13(body-parser v1.12. 2 et express v4. 12. 3) avec le configuration ci-dessous:

var express = require('express');
var app = express();
var bodyParser = require('body-parser');

// configure the app to use bodyParser()
app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(bodyParser.json());

// ... Your routes and methods here

Postman raw JSON charge utile

150
répondu sirthud 2015-03-19 19:04:32

J'ai fait vraiment une erreur stupide et j'ai oublié de définir name attributs pour les entrées dans mon fichier html.

Donc au lieu de

<input type="password" class="form-control" id="password">

J'ai ça.

<input type="password" class="form-control" id="password" name="password">

Maintenant request.body est rempli comme ceci: { password: 'hhiiii' }

33
répondu Jason Kim 2015-01-27 19:22:45

J'ai découvert, que cela fonctionne lors de l'envoi avec le type de contenu

"application/json"

En combinaison avec {[4 Côté Serveur]}

app.use(bodyParser.json());

Maintenant, je peux envoyer via

var data = {name:"John"}
var xmlHttp = new XMLHttpRequest();
xmlHttp.open("POST", theUrl, false); // false for synchronous request
xmlHttp.setRequestHeader("Content-type", "application/json");
xmlHttp.send(data);

Et le résultat est disponible dans request.body.name sur le serveur.

17
répondu Xan-Kun Clark-Davis 2017-06-06 00:36:54

J'ai rencontré ce problème aujourd'hui, et ce qui a résolu c'était de Supprimer l'en-tête content-type dans Postman! Très étrange. En l'ajoutant ici au cas où cela aiderait quelqu'un.

Je suivais le tutoriel beerlocker ici: http://scottksmith.com/blog/2014/05/29/beer-locker-building-a-restful-api-with-node-passport/

16
répondu stone 2015-08-17 06:00:41

Même quand j'apprenais node.js pour la première fois où j'ai commencé à l'apprendre sur web-app, j'avais toutes ces choses bien faites dans ma forme, je n'étais toujours pas en mesure de recevoir des valeurs dans la demande post. Après un long débogage, je suis venu à savoir que dans le formulaire que j'ai fourni enctype="multipart/form-data" en raison de laquelle je n'étais pas en mesure d'obtenir des valeurs. Je l'ai simplement enlevé et cela a fonctionné pour moi.

4
répondu Shaggie 2016-10-26 09:48:52

Un problème similaire m'est arrivé, j'ai simplement mélangé l'ordre des paramètres de rappel. Assurez-vous que vous configurez les fonctions de rappel dans le bon ordre. Au moins pour quelqu'un ayant le même problème.

router.post('/', function(req, res){});
2
répondu Henry Ollarves 2017-01-25 16:33:54

Il semble que si vous n'utilisez aucun encType (par défaut est application/x-www-form-urlencoded), Vous obtenez des champs de saisie de texte mais vous n'obtiendrez pas de fichier.

Si vous avez un formulaire dans lequel vous souhaitez publier une entrée de texte et un fichier, utilisez le type d'encodage multipart/form-data et, en plus de cela, utilisez le middleware multer. Multer analysera l'objet request et préparera req.file pour vous et tous les autres champs d'entrée seront disponibles via req.body.

2
répondu Mohammad Haque 2018-03-27 14:32:29

Vous devez vérifier si le middleware body-parser est correctement défini sur le type de requête (JSON, urlencoded).

Si vous avez défini,

app.use(bodyParser.json());

Ensuite, dans postman, vous devez envoyer les données comme brutes.

Https://i.stack.imgur.com/k9IdQ.png capture d'écran du facteur

Si vous avez défini,

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

Alors l'option' x-www-form-urlencoded ' doit être sélectionnée.

2
répondu Tuan 2018-06-09 11:25:09

Assurez-vous que ["key" : "type", "value" : "json"] & ["key":"Content-Type", "value":"application/x-www-form-urlencoded"] est dans votre facteur en-têtes de requête

1
répondu vpage 2017-08-20 15:45:45

Mon problème était que je créais la route en premier

// ...
router.get('/post/data', myController.postHandler);
// ...

Et l'enregistrement du middleware après l'itinéraire

app.use(bodyParser.json());
//etc

En raison de la structure de l'application et copier et coller le projet ensemble à partir d'exemples.

Une fois que j'ai fixé l'ordre d'enregistrer le middleware avant l'itinéraire, tout a fonctionné.

1
répondu fiat 2018-03-30 11:02:34

J'utilisais restify au lieu d'express et j'ai rencontré le même problème. aolution était de faire:

Serveur.utilisation (restify.bodyParser ());

0
répondu Prabhat 2017-01-20 01:12:45

J'ai résolu cela en utilisant {[2] } comme suggéré ci-dessus, mais ils ont manqué de donner un exemple de travail complet, sur la façon de le faire. Fondamentalement, cela peut se produire lorsque vous avez un groupe de formulaire avec enctype="multipart/form-data". Voici le code HTML pour le formulaire que j'avais:

<form action="/stats" enctype="multipart/form-data" method="post">
  <div class="form-group">
    <input type="file" class="form-control-file" name="uploaded_file">
    <input type="text" class="form-control" placeholder="Number of speakers" name="nspeakers">
    <input type="submit" value="Get me the stats!" class="btn btn-default">            
  </div>
</form>

Et voici comment utiliser multer pour obtenir les valeurs et les noms de cette forme avec Express.js et node.js:

var multer  = require('multer')
var upload = multer({ dest: './public/data/uploads/' })
app.post('/stats', upload.single('uploaded_file'), function (req, res) {
   // req.file is the name of your file in the form above, here 'uploaded_file'
   // req.body will hold the text fields, if there were any 
   console.log(req.file, req.body)
});
0
répondu tsando 2018-04-11 11:26:08

Vous ne devriez pas faire JSON.stringify (données) lors de L'envoi via AJAX comme ci-dessous

this is not correct code
    function callAjax(url, data) {
                $.ajax({
                    url: url,
                    type: "POST",
                    data: JSON.stringify(data),
                    success: function(d) {
                        alert("successs "+ JSON.stringify(d));
                    }
                    });
            }   

Le code correct est

function callAjax(url, data) {
                $.ajax({
                    url: url,
                    type: "POST",
                    data: data,
                    success: function(d) {
                        alert("successs "+ JSON.stringify(d));
                    }
                    });
            }   
0
répondu Achilles Ram Nakirekanti 2018-04-12 06:22:47