Cum se accesează corpul cererii la POSTing folosind Node.js și Express? (Programare, Javascript, Node.Js, Express)

TheBlueSky a intrebat.

Am următorul cod Node.js:

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();
});

Acum, dacă postez ceva de genul:

curl -d user=Someone -H Accept:application/json --url http://localhost:5000

Primesc Someone așa cum era de așteptat. Acum, ce se întâmplă dacă vreau să obțin corpul complet al cererii? Am încercat să fac response.write(request.body) dar Node.js aruncă o excepție spunând „primul argument trebuie să fie un șir de caractere sau un buffer„, apoi merge la o „buclă infinită” cu o excepție care spune „Nu se pot seta antetele după ce sunt trimise.„; acest lucru este valabil și dacă am făcut var reqBody = request.body; și apoi scriind response.write(reqBody).

Care este problema aici?

De asemenea, pot obține cererea brută fără a utiliza express.bodyParser()?

Comentarii

  • Se pare că este ceva cu response.write(reqBody); când folosesc response.send(reqBody) lucrurile merg bine… și da, folosesc response.end după response.write. –  > Por TheBlueSky.
14 răspunsuri
Hector Correa

Express 4.0 și versiunile superioare:

$ npm install --save body-parser

Și apoi în aplicația dvs. de nod:

const bodyParser = require('body-parser');
app.use(bodyParser);

Express 3.0 și mai jos:

Încercați să treceți acest lucru în apelul cURL:

--header "Content-Type: application/json"

și asigură-te că datele tale sunt în format JSON:

{"user":"someone"}

De asemenea, puteți utiliza console.dir în codul node.js pentru a vedea datele din interiorul obiectului, ca în următorul exemplu:

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);

Această altă întrebare ar putea fi de ajutor: Cum să primiți JSON în cererea expresă node.js POST?

Dacă nu doriți să folosiți bodyParser, consultați această altă întrebare: https://stackoverflow.com/a/9920700/446681

Comentarii

  • Am încercat să folosesc curl -d {"user":"Someone"} -H "Content-Type: application/json" --url http://localhost:5000 dar îmi dădea eroarea „Unexpected token u„, de aceea am trecut la apelul menționat în postarea mea inițială. –  > Por TheBlueSky.
  • Am marcat acest lucru ca răspuns din cauza linkului stackoverflow.com/a/9920700/446681 –  > Por TheBlueSky.
  • 43

  • express.bodyParser() este depreciat în Express 4.x. Utilizați npmjs.org/package/body-parser în schimb. –  > Por Luc.
  • @TheBlueSky motivul pentru care ați primit „Unexpected token u” a fost pentru că shell-ul a consumat ghilimelele duble. Același lucru se întâmplă dacă faceți echo any"thing". Datele pe care le postați ar trebui să fie între ghilimele pentru a preveni acest lucru. –  > Por Tom Fenech.
  • Începând cu express 4.16.0 sau o versiune ulterioară, este posibil să folosiți express.json() în app.use() în acest mod => app.use(express.json()); –  > Por Mitro.
rustyx

Pornind de la express v4.16 nu este necesar să se solicite module suplimentare, ci doar să se utilizeze modulul încorporat JSON middleware:

app.use(express.json())

În felul următor:

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
})

Notă – body-parser, , de care depinde acest lucru, este deja inclusă cu express.

De asemenea, nu uitați să trimiteți antetul Content-Type: application/json

Comentarii

    18

  • Mulțumesc, acesta este cel mai bun răspuns pentru 4.16+ atunci. Nu există alte dependențe și funcționează ca un farmec! –  > Por codepleb.
  • Cea mai bună / singura soluție pe care am găsit-o care nu are nevoie de body-parser –  > Por Mote Zart.
Walter Roman

Începând cu Express 4, următorul cod pare să rezolve problema.Rețineți că va trebui să instalați body-parser folosind 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
});

Comentarii

    30

  • Pentru analizarea corpurilor json este necesar să adăugați următoarea linie app.use(bodyParser.json()) –  > Por Camilo Silva.
  • @cml.co există vreun motiv app.use(bodyParser.urlencoded({ extended: true }) este de asemenea necesar? Sunt postarea unui document destul de complex ca JSON în cerere, și extended: false nu a funcționat. Doar atunci când îl setez la true, cererea este analizată corect. –  > Por Utilizator Web.
  • Doar o notă. A trebuit să folosesc app.use(bodyParser.urlencoded({ extended: true })); AND app.use(bodyParser.json()) pentru a obține date json pe un server AWS Linux configurat cu NodeJS și Express. –  > Por David.
Gautam
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);

Acest lucru vă va ajuta. Presupun că trimiteți corpul în json.

Comentarii

  • Întotdeauna uit să adaug bitul bodyParser.json() x_x mulțumesc! –  > Por Jonny Asmar.
Shivam Gupta

Pentru 2019, nu este nevoie să instalați body-parser.

Puteți utiliza:

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
});

Manivannan

Acest lucru poate fi realizat fără body-parser dependență, de asemenea, ascultați request:data și request:end și returnează răspunsul la sfârșitul solicitării, consultați exemplul de cod de mai jos. 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();
    });
});

Peter Lyons

Încercați acest lucru:

response.write(JSON.stringify(request.body));

Aceasta va lua obiectul care bodyParser a creat pentru dvs. și îl va transforma înapoi într-un șir de caractere și îl va scrie în răspuns. Dacă doriți corpul exact al solicitării (cu aceleași spații albe, etc.), veți avea nevoie de data și end listeners atașate la cerere înainte și să construiți șirul bucată cu bucată, așa cum puteți vedea în codul sursă de analiză json din connect.

Arunachalam k

Instalați Body Parser prin comanda de mai jos

$ npm install --save body-parser

Configurați Body Parser

const bodyParser = require('body-parser');
app.use(bodyParser);
app.use(bodyParser.json()); //Make sure u have added this line
app.use(bodyParser.urlencoded({ extended: false }));

ebohlman

Ceea ce pretinzi că ai „încercat să faci” este exact ceea ce ai scris în codul care funcționează „conform așteptărilor” atunci când îl invoci cu curl.

Eroarea pe care o primești nu pare să aibă legătură cu niciunul dintre codurile pe care ni le-ai arătat.

Dacă doriți să obțineți cererea brută, setați handlers pe request pentru data și end (și, bineînțeles, eliminați orice invocare a express.bodyParser()). Rețineți că data vor avea loc în bucăți și că, dacă nu setați o codificare pentru evenimentele data eveniment, aceste bucăți vor fi tampoane, nu șiruri de caractere.

Comentarii

  • Aceasta a fost o greșeală de copy-paste; am vrut să spun request.body și nu request.body.user, , și am corectat-o acum. Apropo, funcția var reqBody = request.body; a fost și este încă corectă, iar când o veți încerca veți obține eroarea pe care o primesc eu. În orice caz, poți să dai un exemplu despre setarea handler-ului pe request; se pare că nu-l găsesc în ghidul expres. –  > Por TheBlueSky.
Shujaath Khan

Dacă sunteți suficient de leneș pentru a citi bucăți de date de post.puteți lipi pur și simplu liniile de mai jos pentru a citi json.

Mai jos este pentru TypeScript similar poate fi făcut și pentru JS.

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 }));

Într-unul dintre controlorii dvs. care primește apeluri POST, folosiți ceea ce se arată mai jos

userController.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 ar trebui să vă analizeze datele json în modelul TS.

Comentarii

  • Nu sunt sigur dacă încerci să încurajezi sau să descurajezi oamenii să folosească răspunsul tău numindu-i leneși 🙂 –  > Por TheBlueSky.
balintn

Sunt absolut nou în JS și ES, dar ceea ce pare să funcționeze pentru mine este doar acest lucru:

JSON.stringify(req.body)

Anunță-mă dacă este ceva în neregulă cu asta!

Comentarii

  • exact ceea ce aveam nevoie –  > Por Josef Henn.
Despertaweb

În cazul meu, îmi lipsea să să setez antetul:

"Content-Type: application/json"

Hadi Mir

Nu ar trebui să folosiți body-parser este depreciat. Încercați acest lucru în schimb

The app.use() este utilizată pentru a monta funcția (funcțiile) middleware specificată (specificate) pe calea care este specificată. Este utilizată în principal pentru a configura middleware pentru aplicația dumneavoastră.

Acum, pentru a accesa corpul, trebuie doar să faceți următoarele

Chandra Kumar

Folosiți următorul cod pentru a înregistra datele postului:

router.post("/users",function(req,res){
    res.send(JSON.stringify(req.body, null, 4));
});

Comentarii

  • Răspunsul dat este incomplet dacă nu se include modulul body-parser. –  > Por gramcha.