Jak korzystać z danych JSON POST w aplikacji Express

307

Wysyłam następujący ciąg JSON na mój serwer.

(
        {
        id = 1;
        name = foo;
    },
        {
        id = 2;
        name = bar;
    }
)

Na serwerze mam to.

app.post('/', function(request, response) {

    console.log("Got response: " + response.statusCode);

    response.on('data', function(chunk) {
        queryResponse+=chunk;
        console.log('data');
    });

    response.on('end', function(){
        console.log('end');
    });
});

Kiedy wysyłam ciąg, pokazuje, że otrzymałem 200 odpowiedzi, ale te dwie pozostałe metody nigdy nie działają. Dlaczego?

neuromancer
źródło

Odpowiedzi:

479

Myślę, że łączysz użycie responseobiektu z tym request.

responseObiekt jest za wysłanie z powrotem odpowiedzi HTTP do klienta wywołującego, podczas gdy jesteś chcąc uzyskać dostęp do korpusu request. Zobacz tę odpowiedź, która zawiera pewne wskazówki.

Jeśli używasz prawidłowego JSON i POSTINGujesz go Content-Type: application/json, możesz użyć bodyParseroprogramowania pośredniego do przeanalizowania treści żądania i umieszczenia wyniku na request.bodytrasie.

var express = require('express')
  , app = express.createServer();

app.use(express.bodyParser());

app.post('/', function(request, response){
  console.log(request.body);      // your JSON
  response.send(request.body);    // echo the result back
});

app.listen(3000);

Testuj według:

$ curl -d '{"MyKey":"My Value"}' -H "Content-Type: application/json" http://127.0.0.1:3000/
{"MyKey":"My Value"}

Zaktualizowano dla Express 4+

Parser treści został podzielony na własny pakiet npm po wersji v4, wymaga osobnej instalacji npm install body-parser

var express = require('express')
  , bodyParser = require('body-parser');

var app = express();

app.use(bodyParser.json());

app.post('/', function(request, response){
  console.log(request.body);      // your JSON
   response.send(request.body);    // echo the result back
});

app.listen(3000);

Aktualizacja dla Express 4.16+

Począwszy od wersji 4.16.0 express.json()dostępne jest nowe oprogramowanie pośrednie.

var express = require('express');

var app = express();

app.use(express.json());

app.post('/', function(request, response){
  console.log(request.body);      // your JSON
   response.send(request.body);    // echo the result back
});

app.listen(3000);
Pero P.
źródło
21
request.body.MyKey
Pero P.
5
Ponieważ konkatenacja wywołuje toString()obiekt. Spójrz na dokumentację węzła dla console.log, ponieważ to sprawdza obiekt i zwraca reprezentację ciągu.
Pero P.
13
console.log('request =' + JSON.stringify(request.body))
Pero P.
3
Prąd console.log()automatycznie skretyfikuje obiekt (via util.inspect()), więc zadziałałoby:console.log("with request", request.body);
Tommy Stanton
4
Ta odpowiedź jest nieaktualna, ale ta z @chrisarton jest aktualna.
Emil Ingerslev
209

Dla Express v4 +

zainstaluj body-parser z npm.

$ npm install body-parser

https://www.npmjs.org/package/body-parser#installation

var express    = require('express')
var bodyParser = require('body-parser')

var app = express()

// parse application/json
app.use(bodyParser.json())

app.use(function (req, res, next) {
  console.log(req.body) // populated!
  next()
})
Chrisrison
źródło
23
dlaczego ciągle wyciągają rzeczy, których wszyscy używają?
light24bulbs
11
@ light24bulbs Więc to (Express) będzie bardziej szczupłe i wredne dla tych, którzy tego nie używają / potrzebują.
andyengle
6
@andyengle To ma sens. Myślę jednak, że praktycznie wszyscy używają analizowania żądań. To wydaje mi się podstawową cechą.
light24bulbs
23
Ponieważ interfejs funkcji oprogramowania pośredniego jest standardem używanym przez wiele bibliotek, umożliwia również aplikacjom, które nie używają programu Express, korzystanie z tych funkcji oprogramowania pośredniego.
Anm
3
Usunięcie go z ekspresu nie pozwala na używanie go przez aplikacje, które nie używają żądań. Mogli go rozdzielić i domyślnie dołączyć do ekspresu.
JJ
18

Czasami nie potrzebujesz bibliotek stron trzecich do parsowania JSON z tekstu. Czasami wszystko, czego potrzebujesz, to następujące polecenie JS, spróbuj najpierw:

        const res_data = JSON.parse(body);
Xims
źródło
3
Pierwotne pytanie dotyczy analizowania JSON z komunikatu POST w frameworku Express. Bez oprogramowania pośredniego BodyParser dane JSON nie będą istnieć we właściwości body obiektu żądania.
ThisClark,
1
Przydało mi się to podczas analizowania odpowiedzi serwera. Dzięki!
Hasan Alsawadi
1
Dziękuję Hasan, doceniam twój komentarz. Pomogło mi to, kiedy szukałem rozwiązania i natknąłem się na ten post. Nie jestem pewien, czy działa we wszystkich przypadkach, ale na pewno działa w niektórych i jest to lepsze rozwiązanie niż korzystanie z biblioteki innej firmy.
xims
1
Twoja odpowiedź i komentarz zawierają odpowiedź z większą ilością informacji (tym więcej informacji znajdziesz tutaj). Powinieneś zaktualizować swoją odpowiedź, aby wskazać, że express potrzebuje parsera ciała lub dać alternatywę, aby wskazać, w jaki sposób parser ciała pobierał dane w pierwszej kolejności.
dewwwald
2
nie określabody
jameshfisher,
15

Dla tych, którzy wchodzą do pustego obiektu req.body

Zapomniałem wpisać headers: {"Content-Type": "application/json"} prośbę. Zmiana rozwiązała problem.

Daniel Thompson
źródło
Nie mogę uwierzyć, że to przegapiłem! Wysyłałem text/jsoni odbierałem {}jako odpowiedź. Całkowity nadzór z mojej strony. Bardzo pomocny.
James M. Lay
Ugh - Też mi tego brakowało. Dziękujemy za opublikowanie tego, więc nie marnuję więcej czasu niż mam!
Steve Gomez
9

@Daniel Thompson wspomina, że ​​zapomniał dodać do żądania {„Content-Type”: „application / json”} . Był w stanie zmienić żądanie, jednak zmiana żądań nie zawsze jest możliwa (tutaj pracujemy na serwerze).

W moim przypadku musiałem wymusić parsowanie content-type: text / plain jako json.

Jeśli nie możesz zmienić typu treści żądania, spróbuj użyć następującego kodu:

app.use(express.json({type: '*/*'}));

Zamiast globalnie używać express.json (), wolę stosować go tylko w razie potrzeby, na przykład w żądaniu POST:

app.post('/mypost', express.json({type: '*/*'}), (req, res) => {
  // echo json
  res.json(req.body);
});
anneb
źródło
7

const express = require('express');
let app = express();
app.use(express.json());

To app.use (express.json) pozwoli ci teraz odczytać przychodzący obiekt JSON

Sura
źródło