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?

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

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

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

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.


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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.