Express 애플리케이션에서 JSON POST 데이터를 사용하는 방법


307

서버에 다음 JSON 문자열을 보내고 있습니다.

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

서버에서 나는 이것을 가지고있다.

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

문자열을 보내면 200 응답을 받았지만 다른 두 가지 방법은 실행되지 않습니다. 왜 그런 겁니까?

답변:


479

나는 당신이 response객체 의 사용을와 함께 사용하고 있다고 생각 합니다 request.

response객체는 HTTP 응답을 호출 클라이언트로 다시 전송하기위한 것이며,의 본문에 액세스하려고합니다 request. 지침을 제공하는 이 답변 을 참조하십시오 .

유효한 JSON을 사용하고로 POST Content-Type: application/json하는 경우 bodyParser미들웨어를 사용 하여 요청 본문을 구문 분석하고 결과를 request.body라우트 에 배치 할 수 있습니다 .

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

다음 라인을 따라 테스트하십시오.

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

Express 4 이상용으로 업데이트

본문 파서는 v4 이후에 자체 npm 패키지로 분리되었으며 별도의 설치가 필요합니다 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);

Express 4.16 이상 업데이트

릴리스 4.16.0부터 새로운 express.json()미들웨어를 사용할 수 있습니다.

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
연결 toString()이 오브젝트를 호출하기 때문 입니다. console.log객체를 검사하고 문자열 표현을 반환 하므로 노드 docs를 살펴보십시오 .
Pero P.

13
console.log('request =' + JSON.stringify(request.body))
Pero P.

3
전류 console.log()는 (을 통해 util.inspect()) 자동으로 객체를 스트링 화 하므로 다음과 같이 작동합니다.console.log("with request", request.body);
Tommy Stanton

4
이 답변은 오래되었지만 @chrisarton의 답변은 최신 상태입니다.
Emil Ingerslev

209

Express v4 +의 경우

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
왜 모든 사람들이 사용하는 물건을 계속 꺼내나요?
light24bulbs

11
@ light24bulbs 따라서 (익스프레스) 더 사용하지 않거나 필요로하지 않는 사람들에게 의미가 있습니다.
andyengle

6
@andyengle 이해가 되네요. 그러나 나는 사실상 모든 사람들이 요청 파싱을 사용한다고 생각합니다. 그것은 나에게 핵심 기능처럼 보인다.
light24bulbs

23
미들웨어 기능 인터페이스는 많은 라이브러리에서 사용하는 표준이므로 Express를 사용하지 않는 앱도 이러한 미들웨어 기능을 사용할 수 있습니다.
Anm

3
요청을 사용하지 않는 앱에서는 명시 적으로 사용하지 않아도 앱을 사용할 수 없습니다. 그들은 그것을 별개로 만들 수 있었고 기본적으로 그것을 명시 적으로 포함시켰다.
JJ

18

때로는 텍스트에서 JSON을 구문 분석하기 위해 타사 라이브러리가 필요하지 않습니다. 때로는 다음 JS 명령이 필요한 모든 것을 먼저 시도하십시오.

        const res_data = JSON.parse(body);

3
원래 질문은 Express 프레임 워크의 POST 메시지에서 JSON을 구문 분석하는 것입니다. BodyParser 미들웨어가 없으면 JSON 데이터는 요청 오브젝트의 body 특성에 존재하지 않습니다.
ThisClark

1
서버 응답을 구문 분석 할 때 이것이 유용하다는 것을 알았습니다. 감사!
Hasan Alsawadi

1
하산 감사합니다, 귀하의 의견에 감사드립니다. 솔루션을 찾고 있었고이 게시물을 보았을 때 도움이되었습니다. 모든 경우에 작동하는지 확실하지 않지만 일부 경우에는 확실히 작동하며 타사 라이브러리를 사용하는 것보다 더 나은 솔루션입니다.
xims

1
귀하의 답변과 의견은 더 많은 정보를 제공합니다 (여기서 더 많은 정보가 귀하의 답변입니다). express에서 body-parser가 필요함을 나타내거나 body-parser가 처음에 데이터를 얻은 방법을 나타내는 대안을 제공하도록 답변을 업데이트해야합니다.
dewwwald

2
정의하지 않음body
jameshfisher

15

빈 물체를 얻는 사람들을 위해 req.body

나는 headers: {"Content-Type": "application/json"} 요청을하는 것을 잊었다 . 변경하면 문제가 해결되었습니다.


내가 이것을 놓쳤다는 것을 믿을 수 없다! 나는 응답 을 보내 text/json거나 받고 있었다 {}. 내 부분에 대한 총 감독. 매우 도움이됩니다.
James M. Lay

어 ~ 나도보고 싶었어 이미 가지고있는 것보다 더 많은 시간을 낭비하지 않도록 게시 해 주셔서 감사합니다!
Steve Gomez

9

에서 : @Daniel 톰슨은 그가 { "응용 프로그램 / JSON" "의 Content-Type을"} 추가 잊고 있었던 것을 언급 요청 . 그는 요청을 변경할 수 있었지만 요청 변경이 항상 가능한 것은 아닙니다 (여기서는 서버에서 작업 중임).

필자의 경우 content-type : text / plain을 json으로 구문 분석해야했습니다.

요청의 컨텐츠 유형을 변경할 수없는 경우 다음 코드를 사용해보십시오.

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

전역 적으로 express.json ()을 사용하는 대신 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());

이 app.use (express.json)를 사용하면 들어오는 post JSON 객체를 읽을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.