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.