Express.js req.corps indéfini
J'ai ce que la configuration de mon Express server
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 encore, lorsque je demande req.body.something
dans mes itinéraires-je obtenir certains d'erreur indiquant que body is undefined
. Voici un exemple d'un itinéraire qui utilise req.body
:
app.post('/admin', function(req, res){
console.log(req.body.name);
});
J'ai lu que ce problème est provoqué par le manque de app.use(express.bodyParser());
mais comme vous pouvez le voir je l'appelle avant de les routes.
La moindre idée?
Vous devez vous connecter pour publier un commentaire.
Vous devez assurez-vous que vous définissez toutes les configurations AVANT la définition des itinéraires. Si vous le faites, vous pouvez continuer à utiliser
express.bodyParser()
.En est un exemple, comme suit:
app.configure
bloc ne dans cet exemple?Versions les plus récentes de l'Express (4.x) a scindé le middleware de la base du cadre. Si vous avez besoin du corps de l'analyseur, vous devez l'installer séparément
puis le faire dans votre code
app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json())
m'a sauvé !!Pas. Vous avez besoin d'utiliser
app.use(express.bodyParser())
avantapp.use(app.router)
. En fait,app.use(app.router)
devrait être la dernière chose que vous appelez.app.use(app.router)
en vertu de la.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 , vous avez installé mnp module nommé "corps-analyseur' en appelant le :
Alors assurez-vous d'avoir inclus les lignes suivantes avant d'appeler les itinéraires
Le Type de Contenu dans l'en-tête de demande qui est vraiment important, surtout lorsque vous affichez les données de roulage ou d'autres outils.
Assurez-vous que vous utilisez quelque chose comme application/x-www-form-urlencoded, application/json ou d'autres, cela dépend de votre post. Laissez ce champ vide, vous confondez Express.
Comme déjà posté sous un autre commentaire, je l'ai résolu en utilisant
au lieu de
Je ne sais toujours pas pourquoi le simple
express.bodyParser()
ne fonctionne pas...connect
module vianpm install connect
et réessayer. C'est la seule chose que je peux penser de par la lecture de la sortie de votre erreur.Content-Type
en-tête deapplication/json
.Content-Type
en-tête deapplication/json
quand je faisais ma demande.application/json
vstext/json
dans la demande de travaux, tel que suggéré par @GrantEagon.Express 4, a construire-dans le corps de l'analyseur. Pas besoin d'installer un organe distinct-analyseur. Donc, ci-dessous:
Ajouter dans votre
app.js
avant l'appel du Routeur
Ressemble le corps-analyseur n'est plus livré avec express. Nous pouvons avoir à l'installer séparément.
Reportez-vous à la git page https://github.com/expressjs/body-parser pour plus d'informations et d'exemples.
Au cas où quelqu'un se jette dans le même problème j'ai eu, je suis à l'aide d'un préfixe d'url comme
qui a été le programme d'installation du routeur
et puis j'ai eu la suite
Qu'est-ce résolu mon problème a été de placer le bodyparser de configuration ci-dessus
app.use('/api', router);
Final
express.bodyParser() doit être dit à quel type de contenu, c'est de l'analyse. Par conséquent, vous devez vous assurer que lorsque vous êtes à l'exécution d'une requête POST, que vous êtes, y compris le "Content-Type" en-tête. Sinon, bodyParser peut ne pas savoir quoi faire avec le corps de votre requête POST.
Si vous êtes à l'aide de curl pour exécuter une requête POST contenant de l'objet JSON dans le corps, il ressemblerait à quelque chose comme ceci:
Si vous utilisez une autre méthode, juste être sûr de mettre le champ d'en-tête à l'aide de quelque convention est approprié.
Vous pouvez essayer d'ajouter cette ligne de code en haut, (après votre exiger des déclarations):
Que pour les raisons pour lesquelles elle travaille, découvrez les docs: https://www.npmjs.com/package/body-parser#bodyparserurlencodedoptions
Utilisation app.utilisation(bodyparser.json()); avant de routage. //.
app.utilisation ("api", routes);
Cétait pour moi aujourd'hui. Aucune des solutions ci-dessus ne fonctionnent pour moi. Mais une petite recherche sur google m'a aidé à résoudre ce problème. Je suis codant pour wechat 3ème partie serveur.
Les choses deviennent un peu plus compliquées lorsque votre node.js l'application nécessite la lecture en streaming de données de POSTES, comme une demande d'un client REST. Dans ce cas, la demande de biens "lisible" est définie à true, et les données POST doit être lu en morceaux afin de recueillir tous les contenus.
http://www.primaryobjects.com/CMS/Article144
Ce problème peut être parce que vous n'avez pas utiliser de corps-analyseur (lien)
De travail, vous devez app.utilisation(app.routeur) après app.utilisation(express.bodyParser()), comme ça:
app.use
surapp.router
avantexpress.bodyParser
mais votre code indique clairement qu'il y a APRÈS. Alors, qui est-il?Cela a sauvé ma journée.
Perdu beaucoup de temps:
Selon le Type de Contenu dans votre client demande
le serveur sont différents, l'un des ci-dessous app.usage():
Source: https://www.npmjs.com/package/body-parser#bodyparsertextoptions
Exemple:
Pour moi,
Côté Client, j'ai eu en dessous de l'en-tête:
Donc, sur le côté serveur, j'ai utilisé:
Puis, req.le corps a bien fonctionné.
C'est aussi une possibilité: Assurez-vous que vous devriez écrire ce code avant la route dans votre app.js(ou index.js fichier.
Je l'ai résolu avec:
Vous pouvez utiliser express corps de l'analyseur.
Dernière version de Express a déjà des corps-analyseur intégré. De sorte que vous pouvez utiliser:
Dans le cas où si vous postez des messages SOAP vous avez besoin d'utiliser des corps de l'analyseur:
Bâtiment sur @kevin-xue dit, le type de contenu doit être déclaré. Dans mon cas, cela n'a été produit avec IE9 car le XDomainRequest ne définit pas un type de contenu, donc bodyparser et expressjs ont été ignorant le corps de la demande.
J'ai eu autour de ce par la définition du type de contenu explicitement avant de transmettre la demande à travers le corps de l'analyseur, comme suit:
De crédit à @spikeyang pour la grande réponse (ci-dessous). Après la lecture de l'article suggéré rattaché à la poste, j'ai décidé de partager ma solution.
Quand les utiliser?
La solution requis pour utiliser l'express routeur afin d'en profiter.. donc:
Si vous avez-vous essayé d'utiliser la accepté de répondre à pas de chance, il suffit d'utiliser un copier-coller de cette fonction:
et de l'appeler comme:
REMARQUE:
Pour les grandes charges - s'il vous plaît utiliser un tableau de la mémoire tampon (@ plus MDN)
Si vous êtes en utilisant certains outil externe qui en font la demande, assurez-vous d'ajouter l'en-tête:
Content-Type: application/json
Pour quiconque aucune des réponses ci-dessus ont travaillé, j'ai eu pour activer la scro entre mon front-end et express.
Vous pouvez le faire soit par:
Le téléchargement et l'activation sur une SCRO extension pour votre navigateur, tels que:
https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en
pour Chrome,
ou par
En ajoutant les lignes
à votre express
app.js
page. (Aprèsnpm install cors
)en Express 4, c'est vraiment simple
Une autre façon de se vider la demande.le corps lorsque vous oubliez le nom de l'attribut de l'élément d'entrée...
ajoutant
express.urlencoded({ extended: true })
de la route résout le problème.La plupart du temps, req.le corps n'est pas défini en raison du manque de parser JSON
pourrait être absent pour le corps-analyseur
et parfois, il est pas défini en raison de cros origine afin de les ajouter