J'ai le code Node.js suivant:
var express = require('express');
var app = express.createServer(express.logger());
app.use(express.bodyParser());
app.post('/', function(request, response) {
response.write(request.body.user);
response.end();
});
Maintenant, si je POST quelque chose comme:
curl -d user=Someone -H Accept:application/json --url http://localhost:5000
Je reçois Someone
comme prévu. Maintenant, que faire si je veux obtenir le corps de la requête complet? J'ai essayé de faire response.write(request.body)
mais Node.js lève une exception disant "le premier argument doit être une chaîne ou un tampon " puis passe à une "boucle infinie" avec une exception qui dit " Impossible de définir les en-têtes après leur envoi. "; cela est également vrai même si je l'ai fait var reqBody = request.body;
et ensuite écrit response.write(reqBody)
.
Quel est le problème ici?
En outre, puis-je simplement obtenir la demande brute sans utiliser express.bodyParser()
?
javascript
node.js
express
Le ciel bleu
la source
la source
response.write(reqBody)
; quand j'utilise lesresponse.send(reqBody)
choses fonctionnent bien ... et oui, je l'utiliseresponse.end
aprèsresponse.write
.Réponses:
Express 4.0 et supérieur:
$ npm install --save body-parser
Et puis dans votre application de nœud:
Express 3.0 et inférieur:
Essayez de transmettre ceci dans votre appel cURL:
--header "Content-Type: application/json"
et assurez-vous que vos données sont au format JSON:
{"user":"someone"}
En outre, vous pouvez utiliser console.dir dans votre code node.js pour voir les données à l'intérieur de l'objet comme dans l'exemple suivant:
Cette autre question pourrait également aider: Comment recevoir JSON dans la demande POST express node.js?
Si vous ne souhaitez pas utiliser le bodyParser, consultez cette autre question: https://stackoverflow.com/a/9920700/446681
la source
curl -d {"user":"Someone"} -H "Content-Type: application/json" --url http://localhost:5000
mais cela me donnait l'erreur " U jeton inattendu ", c'est pourquoi je suis passé à l'appel mentionné dans mon message d'origine.express.bodyParser()
est obsolète dans Express 4.x. Utilisez plutôt npmjs.org/package/body-parser .echo any"thing"
. Les données que vous publiez doivent être entre guillemets pour éviter que cela ne se produise.À partir d' express v4.16, il n'est pas nécessaire de nécessiter de modules supplémentaires, utilisez simplement le middleware JSON intégré :
Comme ça:
Remarque -
body-parser
, dont cela dépend, est déjà inclus avec express.N'oubliez pas non plus d'envoyer l'en-tête
Content-Type: application/json
la source
À partir d'Express 4, le code suivant semble faire l'affaire. Notez que vous devrez installer en
body-parser
utilisantnpm
.la source
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true })
est-elle également requise? Je poste un document assez complexe au format JSON dans la demande et jeextended: false
n'ai pas fonctionné. Ce n'est que lorsque je le mets à true que la demande est correctement analysée.app.use(bodyParser.urlencoded({ extended: true }));
ANDapp.use(bodyParser.json())
pour obtenir des données json sur une configuration de serveur AWS Linux avec NodeJS et Express.Cela vous aidera. Je suppose que vous envoyez le corps en json.
la source
Pour 2019, vous n'avez pas besoin d'installer
body-parser
.Vous pouvez utiliser:
la source
Ceci peut être réalisé sans
body-parser
dépendance aussi bien, écouterrequest:data
etrequest:end
et retourner la réponse en fin de requête, reportez - vous ci - dessous exemple de code. réf: https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/#request-bodyla source
Essaye ça:
Cela prendra l'objet qui
bodyParser
a créé pour vous et le transformera en une chaîne et l'écrira dans la réponse. Si vous voulez que le corps de la demande exacte (avec le même espacement, etc), vous aurez besoindata
etend
auditeurs attachés à la demande avant et construire le morceau de chaîne en morceau que vous pouvez voir dans le code source d'analyse syntaxique JSON de connexion .la source
Ce que vous prétendez avoir "essayé de faire" est exactement ce que vous avez écrit dans le code qui fonctionne "comme prévu" lorsque vous l'invoquez avec curl.
L'erreur que vous obtenez ne semble être liée à aucun des codes que vous nous avez montrés.
Si vous souhaitez obtenir la demande brute, les gestionnaires situé sur
request
lesdata
et lesend
événements (et, bien sûr, supprimez toutes les invocations deexpress.bodyParser()
). Notez que lesdata
événements se produiront par blocs et qu'à moins que vous ne définissiez un codage pour l'data
événement, ces blocs seront des tampons, pas des chaînes.la source
request.body
et nonrequest.body.user
, et je l'ai corrigé maintenant. Au fait,var reqBody = request.body;
c'était et toujours correct et lorsque vous l'essaierez, vous obtiendrez l'erreur que j'obtiens. Quoi qu'il en soit, pouvez-vous s'il vous plaît donner un exemple sur la configuration du gestionnairerequest
; Je ne semble pas le trouver dans le guide express.Si vous êtes assez paresseux pour lire des morceaux de données de publication. vous pouvez simplement coller sous les lignes pour lire json.
Ci-dessous, pour TypeScript, la même chose peut être faite pour JS.
app.ts
Dans l'un de vos contrôleurs qui reçoivent un appel POST, utilisez comme indiqué ci-dessous
userController.ts
la source
Je suis absolument nouveau dans JS et ES, mais ce qui semble fonctionner pour moi est juste ceci:
Faites-moi savoir si quelque chose ne va pas!
la source
Installez Body Parser par la commande ci-dessous
Configurer l'analyseur corporel
la source
Vous utilisez le code suivant pour consigner les données de publication:
la source