Node.js 및 Express를 사용하여 POST 할 때 요청 본문에 액세스하는 방법은 무엇입니까?


175

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

이제 내가 POST를하면 :

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

나는 Someone예상대로 얻는다 . 이제 전체 요청 본문을 얻으려면 어떻게해야합니까? 시도 response.write(request.body)했지만 Node.js는 " 첫 번째 인수는 문자열 또는 버퍼 여야합니다 "라는 예외를 발생시키고 " 송신 후 헤더를 설정할 수 없습니다 "라는 예외와 함께 "무한 루프"로갑니다 . ;; 내가 var reqBody = request.body;한 다음 글을 쓰 더라도 마찬가지 response.write(reqBody)입니다.

여기서 무슨 문제가 있습니까?

또한 사용하지 않고 원시 요청을 얻을 수 express.bodyParser()있습니까?


뭔가있는 것 같습니다 response.write(reqBody). 내가 사용하는 response.send(reqBody)일이 잘 작동하고 있습니다 ... 그리고 그래, 난 사용 response.endresponse.write.
TheBlueSky

답변:


161

Express 4.0 이상 :

$ npm install --save body-parser

그런 다음 노드 앱에서 :

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

Express 3.0 이하 :

cURL 호출에서 이것을 전달하십시오.

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

데이터가 JSON 형식인지 확인하십시오.

{"user":"someone"}

또한 node.js 코드에서 console.dir을 사용하여 다음 예제와 같이 객체 내부의 데이터를 볼 수 있습니다.

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

이 다른 질문도 도움이 될 수 있습니다 : express node.js POST 요청에서 JSON을받는 방법?

bodyParser를 사용하지 않으려면이 다른 질문을 확인하십시오 : https://stackoverflow.com/a/9920700/446681


사용을 시도 curl -d {"user":"Someone"} -H "Content-Type: application/json" --url http://localhost:5000했지만 " 예기치 않은 토큰 u " 오류가 발생 하여 원래 게시물에서 언급 된 통화로 전환 한 것입니다.
TheBlueSky


40
express.bodyParser()Express 4.x에서는 더 이상 사용되지 않습니다. 대신 npmjs.org/package/body-parser 를 사용하십시오 .
Luc

@TheBlueSky "예기치 않은 토큰 u"를 얻은 이유는 쉘이 큰 따옴표를 사용했기 때문입니다. 당신도 같은 일이 일어납니다 echo any"thing". 게시하려는 데이터는 따옴표 안에 있어야이를 방지 할 수 있습니다.
Tom Fenech

11
express 4.16.0 이상에서는 다음과 같이 app.use ()에서 express.json ()을 사용할 수 있습니다. => app.use (express.json ());
Mitro

187

express v4.16 부터 추가 모듈이 필요하지 않고 내장 JSON 미들웨어를 사용하십시오 .

app.use(express.json())

이처럼 :

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

참고- body-parser이 사항은 Express에 이미 포함되어 있습니다.

또한 헤더를 보내는 것을 잊지 마십시오 Content-Type: application/json


14
감사합니다. 이것은 4.16+에 대한 최고의 답변입니다. 다른 의존성은 없으며 매력처럼 작동합니다!
codepleb

1
내가 찾을 수있는 최선의 유일한 해결책은 본문 파서를 필요로하지 않는다
Mote Zart

41

Express 4부터 다음 코드가 트릭을 수행하는 것으로 보입니다. 을 사용 body-parser하여 설치해야합니다 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
});

29
json 본문을 파싱하려면 다음 줄을 추가해야합니다.app.use(bodyParser.json())
Camilo Silva

1
@ cml.co는 이유가 app.use(bodyParser.urlencoded({ extended: true })있다 또한 필요는? 요청에 다소 복잡한 문서를 JSON으로 게시 extended: false했지만 작동하지 않았습니다. 내가 true로 설정하면 요청이 올바르게 구문 분석됩니다.
웹 사용자

3
그냥 참고하십시오. NodeJS 및 Express 를 사용 하여 AWS Linux 서버 설정에서 app.use(bodyParser.urlencoded({ extended: true }));AND 를 사용 app.use(bodyParser.json())하여 JSON 데이터를 가져와야했습니다.
David

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

도움이 될 것입니다. 나는 당신이 json으로 시체를 보내고 있다고 가정합니다.


나는 항상 bodyParser.json () 비트 x_x를 추가하는 것을 잊어 버렸습니다!
Jonny Asmar

14

2019의 경우을 설치할 필요가 없습니다 body-parser.

당신이 사용할 수있는:

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

8

이것은없이 달성 할 수 body-parser잘 듣고로 의존성 request:datarequest:end요청의 끝 부분에있는 응답을 반환, 코드 샘플 아래를 참조하십시오. 심판 : 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();
    });
});

3

이 시도:

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

그것은 bodyParser당신을 위해 만든 객체를 가져 와서 다시 문자열로 바꾸고 응답에 씁니다. 정확한 요청 본문 (같은 공백 등)을 원하면 요청에서 리스너 가 필요 data하며 end연결에서 json 구문 분석 소스 코드에서 볼 수 있듯이 청크별로 문자열 청크를 작성합니다 .


1

"시도했다"고 주장하는 것은 curl로 호출 할 때 "예상대로"작동하는 코드에서 작성한 것입니다.

표시되는 오류는 Google에 표시 한 코드와 관련이없는 것으로 보입니다.

원시 요청을 얻으려면 및 이벤트 에 request대해 핸들러를 설정 하십시오 (물론 호출을 제거하십시오 ). 있습니다 이벤트가 덩어리에서 발생하는 것입니다, 당신은에 대한 인코딩을 설정하지 않는 것이 이벤트 그 덩어리는 버퍼, 문자열이 아니라 할 것이다.dataendexpress.bodyParser()datadata


그것은 복사-붙여 넣기 실수였습니다. 나는 의미 request.body하지 않았고 request.body.user지금 수정했습니다. 그건 그렇고, var reqBody = request.body;여전히 정확하고 시도 할 때 오류가 발생합니다. 어쨌든, 핸들러를 설정하는 방법에 대한 예를 들어 주시겠습니까 request? 나는 그것을 빠른 가이드에서 찾지 못하는 것 같습니다.
TheBlueSky

1

포스트 데이터 덩어리를 읽을 정도로 게으른 경우. json을 읽으려면 단순히 아래 행을 붙여 넣을 수 있습니다.

아래는 JS에 대해서도 유사한 TypeScript를 수행 할 수 있습니다.

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

POST 호출을받는 컨트롤러 중 하나에서 아래와 같이 사용하십시오.

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는 json 데이터를 TS 모델로 구문 분석해야합니다.


1
사람들이 게으른 전화를하여 답변을 사용하도록 권장하거나 권장하지 않는지 잘 모르겠습니다.
TheBlueSky

1

나는 JS와 ES를 처음 접했지만 나에게 맞는 것은 다음과 같습니다.

JSON.stringify(req.body)

문제가 있으면 알려주세요!


정확히 내가 필요한 것
Josef Henn

0

아래 명령으로 Body Parser 설치

$ npm install --save 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 }));

-3

다음 코드를 사용하여 게시물 데이터를 기록합니다.

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

2
본문 파서 모듈을 포함하지 않으면 주어진 답변이 불완전합니다.
gramcha
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.