Tout d'un coup, cela s'est produit pour 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 régler manuellement Content-type : application/json
l'ancien, mais je reçois toujours400 bad request
Cela m'a rendu fou.
Je pensais que c'était quelque chose mis à jour dans l'analyseur corporel mais j'ai rétrogradé et cela n'a pas aidé.
Toute aide appréciée, merci.
Content-Type
postman? Sinon, vous pouvez essayer cela, car j'ai déjà eu des problèmes avec le facteur qui n'envoie pas deContent-Type
.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, remplacez:
Avec:
Voir https://github.com/expressjs/body-parser
Le middleware 'body-parser' ne gère que les données JSON et urlencodées, pas les parties multiples
la source
app.use(express.json());
Avec Postman, pour tester les actions de publication HTTP avec une charge utile de données JSON brutes, sélectionnez l'
raw
option et définissez les paramètres d'en-tête suivants:Veillez également à encapsuler toutes les chaînes utilisées comme clés / valeurs dans votre charge utile JSON entre guillemets.
Le
body-parser
paquet analysera très bien les charges utiles JSON brutes sur plusieurs lignes.Testé dans Chrome v37 et v41 avec l'extension Postman v0.8.4.13 (
body-parser
v1.12.2 etexpress
v4.12.3) avec la configuration ci-dessous:la source
form-data
dans Postman pour publier les données, je reçois toujours le{}
dans le corps de la demande. Dois-je définir l'Content-Type
option?J'ai fait une erreur vraiment stupide et j'ai oublié de définir les
name
attributs des entrées dans mon fichier html.Donc au lieu de
J'ai ceci.
Maintenant
request.body
est rempli comme ceci:{ password: 'hhiiii' }
la source
J'ai découvert que cela fonctionne lors de l'envoi avec un type de contenu
en combinaison avec côté serveur
app.use(bodyParser.json());
Maintenant, je peux envoyer via
et le résultat est disponible
request.body.name
sur le serveur.la source
xmlHttp.send(JSON.stringify(data));
J'ai rencontré ce problème aujourd'hui, et ce qui l'a résolu, c'était de supprimer l'en-tête de type de contenu dans Postman! Très étrange. L'ajouter 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/
la source
Vous devez vérifier si le middleware body-parser est correctement configuré pour le type de requête (json, urlencoded).
Si vous avez défini,
dans postman, vous devez envoyer les données sous forme brute.
https://i.stack.imgur.com/k9IdQ.png capture d'écran du facteur
Si vous avez défini,
alors l'option 'x-www-form-urlencoded' doit être sélectionnée.
la source
Mon problème était que je créais d'abord l'itinéraire
et enregistrer le middleware après l'itinéraire
en raison de la structure de l'application et copiez et collez le projet ensemble à partir d'exemples.
Une fois que j'ai corrigé l'ordre d'enregistrer le middleware avant l'itinéraire, tout a fonctionné.
la source
Même lorsque j'apprenais node.js pour la première fois où je commençais à l'apprendre via une application Web, je faisais bien toutes ces choses dans mon formulaire, mais je ne pouvais toujours pas recevoir de valeurs en post-demande. Après un long débogage, j'ai appris que, sous la forme que j'ai fournie, je n'ai
enctype="multipart/form-data"
pas pu obtenir de valeurs. Je l'ai simplement retiré et cela a fonctionné pour moi.la source
enctype="multipart/form-data"
multer
- voir la documentation sur npmjs.com/package/multerIl semble que si vous n'utilisez pas d'encType (la valeur 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 où vous souhaitez publier une entrée de texte et un fichier, utilisez le
multipart/form-data
type de codage et en plus de cela, utilisez unmulter
middleware. Multer analysera l'objet de demande et se préparerareq.file
pour vous et tous les autres champs de saisie seront disponibles viareq.body
.la source
multer
était en effet la solution à mon problème. Ce serait bien si vous pouviez ajouter un exemple sur la façon de l'utiliser dans le cadre de votre réponseUn 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 toute personne ayant le même problème.
la source
Assurez-vous que ["key": "type", "value": "json"] & ["key": "Content-Type", "value": "application / x-www-form-urlencoded"] est dans votre en-têtes de demande de facteur
la source
J'ai résolu cela en utilisant
multer
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 formulaires avecenctype="multipart/form-data"
. Voici le HTML du formulaire que j'avais:Et voici comment utiliser
multer
pour obtenir les valeurs et les noms de ce formulaire avecExpress.js
etnode.js
:la source
J'ai eu le même problème il y a quelques minutes, j'ai essayé tout ce qui était possible dans les réponses ci-dessus, mais aucune n'a fonctionné.
La seule chose que j'ai faite, c'est la mise à niveau de la version Node JS, je ne savais pas que la mise à niveau pouvait affecter quelque chose, mais elle l'a fait.
J'ai installé la version Node JS
10.15.0
(dernière version), je suis revenu sur8.11.3
et tout fonctionne maintenant. Peut-être que lebody-parser
module devrait corriger cela.la source
Je n'avais pas le nom dans mon entrée ... ma demande était vide ... heureux que cela soit terminé et je peux continuer à coder. Merci tout le monde!
Réponse que j'ai utilisée par Jason Kim:
Donc au lieu de
J'ai ceci
la source
vous ne devriez pas faire
JSON.stringify(data)
lors de l'envoi via AJAX comme ci-dessous.Ce n'est PAS un code correct:
Le bon code est:
la source
Si vous faites avec le facteur, veuillez confirmer ces choses lorsque vous demandez une API
la source
J'utilisais restify au lieu d'exprimer et j'ai rencontré le même problème. La solution était de faire:
la source
Je crois que cela peut résoudre
app.use(express.json());
la source
Changez
app.use(bodyParser.urlencoded());
votre code enet dans postman, dans l'en-tête, changez la
Content-Type
valeur deapplication/x-www-form-urlencoded
enapplication/json
Ta :-)
la source
Merci à tous pour vos bonnes réponses! J'ai passé pas mal de temps à chercher une solution, et de mon côté je faisais une erreur élémentaire: j'appelais
bodyParser.json()
depuis la fonction:J'avais juste besoin de faire
app.use(['/password'], bodyParser.json())
et ça a marché ...la source
Dans Postman, même après avoir suivi la réponse acceptée, je recevais un corps de demande vide. Le problème s'est avéré ne pas passer un en-tête appelé
Cet en-tête était présent par défaut (avec 5 autres) que j'ai désactivé. Activez-le et vous recevrez le corps de la demande.
la source
Mon problème était de créer l'itinéraire d'abord,
require("./routes/routes")(app);
je l'ai déplacé à la fin du code avantapp.listen
et cela a fonctionné!la source
Déjà résolu le problème, mais peut aider quelqu'un.
Assurez-vous que chacun de vos éléments de formulaire est associé à un nom. C'était l'erreur que je faisais ...!
la source