body-parser는 express와 어떤 관계가 있습니까?


339

body-parser를 사용하지 않고 데이터를 얻을 수 있기 때문에 Express 응용 프로그램에 왜 필요한지 이해할 수 없습니다 body-parser. 그리고 실제로 무엇을하고 어떻게합니까?


54
HTTP POST 데이터를 읽으려면 "body-parser"노드 모듈을 사용해야합니다. body-parser는 폼의 입력을 읽고이를 통해 액세스 가능한 자바 스크립트 객체로 저장하는 Express 미들웨어의 일부입니다.req.body
refactor

2
express를 사용하면 헤더 req.headers(배열) 와 같은 HTTP 요청 내부의 모든 데이터 를 읽을 수 req.body있으며 @CleanCrispCode 에서 설명한 대로 http 패킷의 본문을 읽을 수 있으며 query parameter로 읽을 수 있습니다. req.query.variableexpress는 자동으로 요청을 javascript로 변환하므로 도움이됩니다. 객체
페르난도 Zamperin

3
@refactor-이것은 body 파서 를 사용해야 하는 많은 이유 중 하나 일 수 있지만 HTTP 요청 및 응답 객체가 스트림이며 단일 객체로 '판독 가능하지'않다는 것을 말하지 않습니다. 같은 전체 스트림에 버퍼링없이되는 제. res.bodyres.body
ortonomy

1
Express 버전 4.16 이상에는 자체 버전의 바디 파서가 내장되어 있으므로이 패키지를 가져올 필요가 없습니다.
StefanBob

답변:


255

Express.js 버전 4 이상 HTTP POST에서 요청 을 처리하려면 이라는 미들웨어 모듈을 설치해야합니다 .body-parser

body-parser들어오는 요청 스트림의 전체 본문 부분을 추출하여에 노출합니다 req.body.

미들웨어는 이전에 Express.js의 일부 였지만 이제 별도로 설치해야합니다.

body-parser모듈은 HTTP POST요청을 사용하여 제출 된 JSON, 버퍼, 문자열 및 URL 인코딩 데이터를 구문 분석합니다 . body-parser아래와 같이 NPM을 사용하여 설치하십시오 .

npm install body-parser --save

2019 년 4 월 2 일 수정 : express@4.16.0에서 express와 번들로 제공되는 body-parser 미들웨어. 자세한 내용은 이것을 참조하십시오


126
이것은 아마도 가장 작은 것입니다. Express 핵심 개발자가 왜 웹 개발에서 가장 일반적인 사용 사례를 위해 추가 미들웨어를 설치하여 신규 사용자가 보드에 올라 가기가 어려울까요?
elmt

5
@elmt 의견이 있으시면 sails.js를 사용해보십시오
George

1
@ user1063287 그렇습니다. urlencoded()그리고 json()실제로 미들웨어 기능을 반환 미들웨어 공장이있는 원용next()
닉 매닝

3
@elmt를 손상시키지 않으며, 노드는 웹 전용 일뿐만 아니라 데스크탑, 모바일 등에서 사용할 수 있으며,이 경우 필수 모듈이 아닙니다. 노드는 어떠한 책임도없이 애플리케이션에 적응할 수 있습니다
fnaquira

28
@fnaquira-혼란 스러워요. 이것은 노드가 아닌 Express에 관한 것입니다.
elmt

85

예, 우리는없이 일할 수 있습니다 body-parser. 사용하지 않으면 원시 요청이 발생하고 본문과 헤더가 request 매개 변수의 루트 객체에 없습니다. 모든 필드를 개별적으로 조작해야합니다.

또는 body-parserExpress 팀이 유지 관리 할 때 사용할 수 있습니다 .

본문 구문 분석기가 수행 할 수있는 작업 : 요청을 단순화합니다.
사용 방법 : 예는 다음과 같습니다.

설치 npm install body-parser --save

이 방법으로 본문 파서를 사용하는 방법은 다음과 같습니다.

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

// support parsing of application/json type post data
app.use(bodyParser.json());

//support parsing of application/x-www-form-urlencoded post data
app.use(bodyParser.urlencoded({ extended: true }));

링크.

https://github.com/expressjs/body-parser .

그리고 루트 요청 객체에서 본문과 헤더를 얻을 수 있습니다. 예

app.post("/posturl",function(req,res,next){
    console.log(req.body);
    res.send("response");
})

3
정보 주셔서 감사합니다, 본문 파서없이 코드 예제를 게시 할 수 있습니까?
Ilyas karim

55

답은 여기에 매우 상세하고 화려하게, 대답은 포함 설명 :

한마디로; body-parser 는 들어오는 요청 스트림의 전체 본문 부분을 추출하여 req.body인터페이스하기 쉬운 것으로 노출시킵니다 . 스스로 할 수 있기 때문에 그 자체로는 필요하지 않습니다. 그러나 대부분 원하는 작업을 수행하고 문제를 해결할 것입니다.


좀 더 깊이 들어가기 위해; body-parser는 들어오는 요청 데이터가 압축 된 경우 nodejs / zlib 를 사용 하여 들어오는 요청 데이터의 압축을 풀고 요청 본문 의 전체 원시 컨텐츠를 "파싱"하기 전에 stream-utils / raw-body 를 기다리는 미들웨어를 제공합니다. 요청 본문을 사용하지 않고 시간을 낭비했습니다).

원시 컨텐츠를 보유한 후 body-parser는 사용하기로 결정한 특정 미들웨어에 따라 네 가지 전략 중 하나를 사용하여 구문 분석합니다.

  • bodyParser.raw () : 실제로 본문을 구문 분석하지 않고 이전에 버퍼링 된 내용을 Buffer on에 노출시킵니다 req.body.

  • bodyParser.text () : 버퍼를 일반 텍스트로 읽고 결과 문자열을 req.body에 노출합니다.

  • bodyParser.urlencoded () : 텍스트를 URL로 인코딩 된 데이터 (브라우저가 일반 양식 세트에서 POST로 양식 데이터를 보내는 방법)로 구문 분석하고에 결과 객체 (키 및 값 포함)를 노출합니다 req.body. 비교하려고; PHP에서는이 모든 것이 자동으로 수행되고에 노출됩니다 $_POST.

  • bodyParser.json () : 텍스트를 JSON으로 구문 분석하고 결과 객체를에 노출합니다 req.body.

req.body원하는 내용으로 설정 한 후에 만 스택에서 다음 미들웨어를 호출하여 압축 해제 및 구문 분석 방법에 대해 생각할 필요없이 요청 데이터에 액세스 할 수 있습니다.

body-parser github 를 참조하여 설명서를 읽을 수 있으며 작동에 관한 정보가 들어 있습니다.


47

이 최소한의 기술을 유지하려고 노력합시다.

html 양식 데이터를 node-js 서버로 전송한다고 가정 해 봅시다. 즉, 서버에 요청했습니다. 서버 파일은 요청 객체 아래에서 요청을받습니다. 이제 로직으로,이 요청 객체를 서버 파일에 콘솔 로그하면 폼 데이터가 어느 위치에 있는지 확인할 수 있습니다. 당신은 실제로하지 않습니다!

데이터는 어디에 있습니까? 요청에 포함되지 않은 경우 어떻게 추출합니까?

http에 대한 간단한 설명은 http가 양식 데이터를 대상에 도달 할 때 조합되도록 비트 및 조각으로 전송한다는 것입니다. 데이터를 어떻게 추출할까요?

그러나 왜 수동으로 청크에 대한 데이터를 수동으로 구문 분석하고 조립해야 할 때마다 이러한 고통을 겪을까요? 이를 위해“body-parser”라는 것을 사용하십시오.

body-parser는 요청을 구문 분석하고 필요한 관련 정보를 쉽게 추출 할 수있는 형식으로 변환합니다.

예를 들어 프론트 엔드에 가입 양식이 있다고 가정 해 봅시다. 작성 중이며 서버에 세부 사항을 저장하도록 요청하고 있습니다.

body-parser를 사용하면 요청에서 사용자 이름과 비밀번호를 추출하는 것이 아래와 같이 간단합니다.

var loginDetails = {    
    username : request.body.username,    
    password : request.body.password    
};

따라서 기본적으로 body-parser는 들어오는 요청을 구문 분석하고 양식 데이터를 포함하는 청크를 모은 다음이 본문 객체를 만들어 양식 데이터로 채 웁니다.


10

HTTP 요청 본문을 구문 분석합니다. 이것은 특히 원하는 정보가 본문에 포함 된 POST 또는 PUT PATCH HTTP 요청의 컨텍스트에서 적중 한 URL 이상을 알아야하는 경우에 필요합니다.

기본적으로 JSON, 일반 텍스트를 구문 분석하거나 필요에 따라 처리 할 원시 Buffer 객체를 반환하기위한 미들웨어입니다.


8

게시물 데이터에 액세스하려면를 사용해야 body-parser합니다. 기본적으로 body-parser표현이 본문을 읽고 Json이해할 수 있는 객체 로 구문 분석 할 수 있는 것은 무엇입니까 ?


7

이것들은 모두 편의상의 문제입니다.

기본적으로 질문이 '우리 사용해야 body-parser합니까?' 내 대답은 아니오 야'. 일반적으로 유연성이 떨어지고 동일한 정보를 얻기 위해 작성해야하는 코드의 양을 증가시키는보다 회로적인 경로를 사용하여 클라이언트 후 요청에서 동일한 정보를 얻을 수 있습니다.

이 질문으로 종류 같은의는 '음주 우리가 필요로 사용하기 express시작하는?' 다시 말하지만, 대답은 없습니다. 다시 말하지만 표현 된 기본 기능을 '내장'으로 수행하기 위해 더 많은 코드를 작성해야하는 번거 로움이 줄어 듭니다.

표면적으로- body-parser원시 데이터 스트림을 캡처하고 정보가 어떤 형식인지 파악하는 대신 클라이언트 요청에 포함 된 정보를 다양한 형식으로보다 쉽게 ​​얻을 수 있습니다. 정보를 사용 가능한 데이터로 수동으로 구문 분석하지 않습니다.


6

요청 본문 이해

POST 또는 PUT 요청을 수신 할 때 요청 본문이 애플리케이션에 중요 할 수 있습니다. 본문 데이터를 얻는 것은 요청 헤더에 액세스하는 것보다 조금 더 복잡합니다. 핸들러로 전달 된 요청 객체는 ReadableStream 인터페이스를 구현합니다. 이 스트림은 다른 스트림과 마찬가지로 다른 곳에서 청취하거나 파이프 할 수 있습니다. 스트림의 '데이터'및 '종료'이벤트를 수신하여 스트림에서 바로 데이터를 가져올 수 있습니다.

각 '데이터'이벤트에서 생성 된 청크는 버퍼입니다. 그것이 문자열 데이터가 될 것이라는 것을 알고 있다면 가장 좋은 방법은 배열로 데이터를 수집 한 다음 '끝'에서 연결하고 문자열 화하는 것입니다.

let body = [];
request.on('data', (chunk) => {
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString();
  // at this point, `body` has the entire request body stored in it as a string
});

본문 파서 이해

문서에 따라

req.body 특성에서 사용 가능한 핸들러 전에 미들웨어에서 수신 요청 본문을 구문 분석하십시오.

첫 번째 예에서 보았 듯이 본문을 추출하기 위해 들어오는 요청 스트림을 수동으로 구문 분석해야했습니다. 서로 다른 유형의 여러 양식 데이터가있는 경우에는 지루한 작업이됩니다. 따라서이 모든 작업을 수행하는 body-parser 패키지를 사용합니다.

다양한 유형의 데이터를 구문 분석하기위한 4 개의 모듈을 제공합니다.

원시 컨텐츠 본문 파서가 있으면 위의 전략 중 하나를 사용하여 (사용하기로 결정한 미들웨어에 따라) 데이터를 구문 분석합니다. 설명서를 읽으면 더 자세한 내용을 읽을 수 있습니다.

req.body구문 분석 된 본문으로 설정 한 후 body-parser는 next()스택 아래로 다음 미들웨어를 호출 하도록 호출합니다. 그러면 압축 해제 및 구문 분석 방법에 대해 생각할 필요없이 요청 데이터에 액세스 할 수 있습니다.

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