Je l'ai comme configuration de mon serveur Express
app.use(app.router);
app.use(express.cookieParser());
app.use(express.session({ secret: "keyboard cat" }));
app.set('view engine', 'ejs');
app.set("view options", { layout: true });
//Handles post requests
app.use(express.bodyParser());
//Handles put requests
app.use(express.methodOverride());
Mais quand je demande req.body.something
dans mes itinéraires, je reçois une erreur en le signalant body is undefined
. Voici un exemple de route qui utilise req.body
:
app.post('/admin', function(req, res){
console.log(req.body.name);
});
J'ai lu que ce problème est causé par le manque de app.use(express.bodyParser());
mais comme vous pouvez le voir je l'appelle avant les itinéraires.
Un indice?
Les dernières versions d'Express (4.x) ont dégroupé le middleware du framework principal. Si vous avez besoin d'un analyseur de corps, vous devez l'installer séparément
puis faites-le dans votre code
la source
app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json())
m'a sauvé !!Non, vous devez utiliser
app.use(express.bodyParser())
avantapp.use(app.router)
. En fait, ceapp.use(app.router)
devrait être la dernière chose que vous appelez.la source
app.use(app.router)
sous les.use
appels ne résout pas le problème :(.app.use(require('connect').bodyParser());
au lieu deapp.use(express.bodyParser());
.var router=express.Router()
;Assurez-vous d'abord que vous avez installé le module npm nommé 'body-parser' en appelant:
Assurez-vous ensuite d'avoir inclus les lignes suivantes avant d'appeler des itinéraires
la source
Express 4, possède un analyseur de corps intégré. Pas besoin d'installer un analyseur de corps séparé. Donc ci-dessous fonctionnera:
la source
Le type de contenu dans l'en-tête de demande est vraiment important, surtout lorsque vous publiez les données de curl ou de tout autre outil.
Assurez-vous que vous utilisez quelque chose comme application / x-www-form-urlencoded, application / json ou autres, cela dépend de vos données de publication. Laisser ce champ vide confondra Express.
la source
Comme déjà posté sous un commentaire, je l'ai résolu en utilisant
au lieu de
Je ne sais toujours pas pourquoi le simple
express.bodyParser()
ne fonctionne pas ...la source
connect
module vianpm install connect
et de réessayer. C'est la seule chose à laquelle je peux penser en lisant la sortie de votre erreur.Content-Type
têteapplication/json
.Content-Type
têteapplication/json
lorsque je faisais ma demande.application/json
vstext/json
dans les travaux de demande, comme suggéré par @GrantEagon.la source
Ajoutez votre
app.js
avant l'appel du routeur
la source
Il semble que l'analyseur de corps ne soit plus expédié avec express. Nous devrons peut-être l'installer séparément.
Reportez-vous à la page git https://github.com/expressjs/body-parser pour plus d'informations et d'exemples.
la source
Au cas où quelqu'un rencontrerait le même problème que je rencontrais; J'utilise un préfixe d'URL comme
qui a été configuré avec un routeur
puis j'ai eu ce qui suit
Ce qui a résolu mon problème était de placer la configuration du bodyparser au-dessus
app.use('/api', router);
Final
la source
express.bodyParser () doit être informé du type de contenu qu'il s'agit d'analyser. Par conséquent, vous devez vous assurer que lorsque vous exécutez une demande POST, vous incluez l'en-tête "Content-Type". Sinon, bodyParser peut ne pas savoir quoi faire avec le corps de votre demande POST.
Si vous utilisez curl pour exécuter une requête POST contenant un objet JSON dans le corps, cela ressemblerait à ceci:
Si vous utilisez une autre méthode, assurez-vous simplement de définir ce champ d'en-tête en utilisant la convention appropriée.
la source
Utilisez app.use (bodyparser.json ()); avant le routage. //. app.use ("/ api", routes);
la source
Vous pouvez essayer d'ajouter cette ligne de code en haut, (après vos instructions require):
Quant aux raisons pour lesquelles cela fonctionne, consultez les documents: https://www.npmjs.com/package/body-parser#bodyparserurlencodedoptions
la source
La plupart du temps, req.body n'est pas défini en raison de l'analyseur JSON manquant
pourrait être manquant pour l'analyseur corporel
et parfois, il n'est pas défini en raison de l'origine des cros, alors ajoutez-les
la source
Cela m'est arrivé aujourd'hui. Aucune des solutions ci-dessus ne fonctionne pour moi. Mais un peu de recherche sur Google m'a aidé à résoudre ce problème. Je code pour un serveur tiers wechat.
Les choses deviennent un peu plus compliquées lorsque votre application node.js nécessite la lecture de données POST en streaming, comme une demande d'un client REST. Dans ce cas, la propriété de la requête "lisible" sera définie sur true et les données POST doivent être lues par blocs afin de collecter tout le contenu.
http://www.primaryobjects.com/CMS/Article144
la source
Perdu beaucoup de temps:
Selon le type de contenu dans votre demande client,
le serveur doit avoir un autre, l'un des app.use () ci-dessous:
Source: https://www.npmjs.com/package/body-parser#bodyparsertextoptions
Exemple:
Pour moi, côté client, j'avais en-dessous:
Donc, côté serveur, j'ai utilisé:
Ensuite, tout le monde a bien fonctionné.
la source
dans Express 4, c'est vraiment simple
la source
Pour travailler, vous devez app.use (app.router) après app.use (express.bodyParser ()) , comme ceci:
la source
app.use
surapp.router
avant ,express.bodyParser
mais votre code indique clairement son APRÈS. Alors c'est quoi?Cela m'a sauvé la journée.
la source
Ce problème peut être dû au fait que vous n'avez pas utilisé l'analyseur de corps ( lien )
la source
Je l'ai résolu avec:
la source
C'est également une possibilité : assurez-vous que vous devez écrire ce code avant l'itinéraire dans votre fichier app.js (ou index.js).
la source
Vous pouvez utiliser l'analyseur corporel express.
la source
La dernière version d'Express a déjà intégré l'analyseur de corps. Vous pouvez donc utiliser:
la source
Si vous postez un message SOAP, vous devez utiliser un analyseur de corps brut:
la source
En s'appuyant sur @ kevin-xue, le type de contenu doit être déclaré. Dans mon cas, cela ne se produisait qu'avec IE9 parce que XDomainRequest ne définit pas de type de contenu , donc bodyparser et expressjs ignoraient le corps de la demande.
J'ai contourné cela en définissant explicitement le type de contenu avant de passer la demande à l'analyseur de corps, comme ceci:
la source
Crédit à @spikeyang pour la grande réponse (ci - dessous). Après avoir lu l'article suggéré en pièce jointe, j'ai décidé de partager ma solution.
Quand utiliser?
La solution vous obligeait à utiliser le routeur express pour en profiter .. donc: Si vous avez essayé d'utiliser la réponse acceptée sans succès, utilisez simplement le copier-coller de cette fonction:
et appelez-le comme:
REMARQUE: pour les grandes charges utiles - veuillez utiliser un tampon de tableau ( plus @ MDN )
la source
Si vous utilisez un outil externe pour effectuer la demande, assurez-vous d'ajouter l'en-tête:
Content-Type: application/json
la source
Pour toute personne pour laquelle aucune des réponses ci-dessus n'a fonctionné, j'ai dû activer les cors entre mon front-end et express.
Vous pouvez le faire soit par:
Téléchargement et activation d'une extension CORS pour votre navigateur, telle que:
https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en
pour Chrome,
ou par
Ajout des lignes
à votre
app.js
page express . (Aprèsnpm install cors
)la source