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, si je veux obtenir le corps complet de la demande? 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 disant "Impossible de définir les en-têtes après leur envoi. "; Cela est également vrai même si j’ai fait var reqBody = request.body;
puis que j’écrivais response.write(reqBody)
.
Quel est le problème ici?
De plus, puis-je obtenir la demande brute sans utiliser express.bodyParser()
?
$ npm install --save body-parser
Et ensuite dans votre application de nœud:
const bodyParser = require('body-parser');
app.use(bodyParser);
Essayez de transmettre ceci dans votre appel cURL:
--header "Content-Type: application/json"
et en vous assurant que vos données sont au format JSON:
{"user":"someone"}
De plus, vous pouvez utiliser console.dir dans votre code node.js pour afficher les données à l'intérieur de l'objet, comme dans l'exemple suivant:
var express = require('express');
var app = express.createServer();
app.use(express.bodyParser());
app.post('/', function(req, res){
console.dir(req.body);
res.send("test");
});
app.listen(3000);
Cette autre question pourrait également aider: Comment recevoir du JSON dans une demande express node.js POST?
Si vous ne souhaitez pas utiliser bodyParser, consultez cette autre question: https://stackoverflow.com/a/9920700/446681
À partir de express v4.16 , il n’est pas nécessaire de demander des modules supplémentaires, utilisez simplement le middleware JSON intégré :
app.use(express.json())
Comme ça:
const express = require('express')
app.use(express.json()) // <==== parse request body as JSON
app.listen(8080)
app.post('/test', (req, res) => {
res.json({requestBody: req.body}) // <==== req.body will be a parsed JSON object
})
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
A partir d'Express 4, le code suivant apparaît pour faire l'affaire. Notez que vous devrez installer body-parser
à l'aide de npm
.
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.listen(8888);
app.post('/update', function(req, res) {
console.log(req.body); // the posted data
});
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json())
var port = 9000;
app.post('/post/data', function(req, res) {
console.log('receiving data...');
console.log('body is ',req.body);
res.send(req.body);
});
// start the server
app.listen(port);
console.log('Server started! At http://localhost:' + port);
Cela vous aidera. Je suppose que vous envoyez des corps en JSON.
Ceci peut également être réalisé sans la dépendance body-parser
, écoutez request:data
et request:end
et renvoyez la réponse à la fin de la demande, voir ci-dessous exemple de code. ref: https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/#request-body
var express = require('express');
var app = express.createServer(express.logger());
app.post('/', function(request, response) {
// Push the data to body
var body = [];
request.on('data', (chunk) => {
body.Push(chunk);
}).on('end', () => {
// on end of data, perform necessary action
body = Buffer.concat(body).toString();
response.write(request.body.user);
response.end();
});
});
Essaye ça:
response.write(JSON.stringify(request.body));
Cela prendra l'objet que bodyParser
a créé pour vous, le transformera en chaîne et l'écrira dans la réponse. Si vous voulez le corps de requête exact (avec le même espace, etc.), vous aurez besoin des écouteurs data
et end
attachés à la demande avant et de construire le morceau de chaîne par morceau comme vous pouvez le voir dans JSON analysant le code source de connect .
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 pas être liée au code que vous nous avez montré.
Si vous voulez obtenir la requête brute, définissez les gestionnaires sur request
pour les événements data
et end
(et, bien sûr, supprimez toute invocation de express.bodyParser()
). Notez que les événements data
se produiront dans des fragments et que, à moins que vous ne définissiez un codage pour l'événement data
, ces morceaux seront des tampons, pas des chaînes.
Pour 2019, vous n'avez pas besoin d'installer body-parser
.
Vous pouvez utiliser:
var express = require('express');
var app = express();
app.use(express.json())
app.use(express.urlencoded({extended: true}))
app.listen(8888);
app.post('/update', function(req, res) {
console.log(req.body); // the posted data
});
Si vous êtes assez paresseux pour lire des morceaux de données post. vous pouvez simplement coller les lignes ci-dessous pour lire JSON.
Vous trouverez ci-dessous une procédure similaire pour TypeScript.
app.ts
import bodyParser from "body-parser";
// support application/json type post data
this.app.use(bodyParser.json());
// support application/x-www-form-urlencoded post data
this.app.use(bodyParser.urlencoded({ extended: false }));
Dans l’un de vos contrôleurs qui reçoit POST appel, comme indiqué ci-dessous
serController.ts
public async POSTUser(_req: Request, _res: Response) {
try {
const onRecord = <UserModel>_req.body;
/* Your business logic */
_res.status(201).send("User Created");
}
else{
_res.status(500).send("Server error");
}
};
_req.body devrait vous analyser les données Json dans votre modèle TS.