Express.js req.body 정의되지 않음


292

Express 서버의 구성으로 이것을 가지고 있습니다

app.use(app.router); 
app.use(express.cookieParser());
app.use(express.session({ secret: "keyboard cat" }));
app.set('view engine', 'ejs');
app.set("view options", { layout: true });
//Handles post requests
app.use(express.bodyParser());
//Handles put requests
app.use(express.methodOverride());

그러나 여전히 req.body.something경로에서 요청할 때이를 가리키는 오류가 발생합니다 body is undefined. 다음은 다음을 사용하는 경로의 예입니다 req.body.

app.post('/admin', function(req, res){
    console.log(req.body.name);
});

나는이 문제가 부족하기 때문에 발생한다는 것을 읽었 app.use(express.bodyParser());지만 알 수 있듯이 경로 전에 호출합니다.

실마리?

답변:


296

경로를 정의하기 전에 모든 구성을 정의해야합니다. 그렇게하면 계속 사용할 수 있습니다 express.bodyParser().

예를 들면 다음과 같습니다.

var express = require('express'),
    app     = express(),
    port    = parseInt(process.env.PORT, 10) || 8080;

app.configure(function(){
  app.use(express.bodyParser());
  app.use(app.router);
});

app.listen(port);

app.post("/someRoute", function(req, res) {
  console.log(req.body);
  res.send({ status: 'SUCCESS' });
});

9
이것은 나를 위해 일했습니다. 참고 : 불행히도 일부 자습서에는 app.configure () 전에 경로를 지정하는 사람들이 있습니다. 필자의 경우 이것은 app.get / post 등의 형식이며이를 포함하는 require ()입니다.
bendman 2019

1
감사합니다. 하루 종일이 문제를 해결하고있었습니다.
jfplataroti

11
express 4부터 app.use (app.router)가 제거되었습니다. 문서를 참조하십시오 github.com/visionmedia/express/wiki/New-features-in-4.x
Jonathan Ong

15
express 4부터 bodyParser와 같은 미들웨어는 더 이상 Express와 번들로 제공되지 않으며 별도로 설치해야합니다. github.com/senchalabs/connect#middleware에서 자세한 정보를 찾을 수 있습니다 .
andrea.rinaldi

2
감사. 이 답변은 2 세 이상이며 여전히 곤경에 처한 사람들을 돕고 있습니다 :)
Lorenzo Marcon

275

최신 버전의 Express (4.x)는 핵심 프레임 워크에서 미들웨어를 번들 해제했습니다. 본문 파서가 필요한 경우 별도로 설치해야합니다.

npm install body-parser --save

그런 다음 코드 에서이 작업을 수행하십시오.

var bodyParser = require('body-parser')
var app = express()

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))

// parse application/json
app.use(bodyParser.json())

2
최근에 4.x를 표현하도록 업데이트했습니다. 처음에 req.body를 기록하려고 할 때 정의되지 않은 것으로 표시되었습니다. body-parser를 설치하고 사용하면 req.body 값이 예상됩니다. :)
Alok Adhao

내 POST 요청이 json-server와 작동하지 않는 이유를 해결하려고 할 때 이것이 유용하다는 것을 알았습니다.
freethebees

내 하루, 특히 'app.use (bodyParser.json ())'부분을 저장했습니다. 고마워 친구! : D
neaGaze

이것은 Express 4에서 완전히 작동하기 때문에 허용되는 답변이어야합니다! 감사합니다!
결합

2
app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()) 나를 구했다!
Pramesh Bajracharya 2016 년

71

아니요 . app.use(express.bodyParser())전에 사용해야 app.use(app.router)합니다. 실제로 app.use(app.router)마지막으로 전화해야합니다.


심지어 이동 app.use(app.router)세 이하 .use문제를 :( 해결되지 않는 통화.
Masiar

약간 고군분투 한 후에 app.use(require('connect').bodyParser());대신 대신 사용하여 해결했습니다 app.use(express.bodyParser());.
Masiar

예, 사용할 때도 대답은 사실입니다 var router=express.Router().
Istiaque Ahmed

1
약간의 부록, app.router
craft

이 의견을 축복하십시오
Ke Ke

40

먼저 다음을 호출하여 'body-parser'라는 npm 모듈을 설치했는지 확인하십시오.

npm install body-parser --save

그런 다음 경로를 호출하기 전에 다음 줄을 포함했는지 확인하십시오

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

app.use(bodyParser.json());

express.json을 사용하는 경우 왜 본문 파서를 가져 옵니까?
SanSolo

38

Express 4에는 바디 파서가 내장되어 있습니다. 별도의 본문 파서를 설치할 필요가 없습니다. 아래는 작동합니다.

export const app = express();
app.use(express.json());

37

요청 헤더의 Content-Type은 특히 curl 또는 다른 도구에서 데이터를 게시 할 때 매우 중요합니다.

application / x-www-form-urlencoded, application / json 또는 기타와 같은 것을 사용하고 있는지 확인하십시오. 게시 데이터에 따라 다릅니다. 이 필드를 비워두면 Express가 혼동됩니다.


12
+1 이것이 문제였습니다. Chrome 용 Postman을 사용하여 REST에 내장 된 JSON API를 테스트하고 있었지만 Express에서받은 객체는 매번 비어있었습니다. 기본적으로 Postman은 raw> json을 선택하더라도 'Content-Type : application / json'헤더를 자동으로 추가 하지 않습니다 .
Jordan

@Jordan +1 이것을 지적 해 주셔서 감사합니다. 실제로 방금 헤더를 확인했는데 'json'을 선택했지만 여전히 'text / plain'으로 설정되어 있습니다.
엔지니어

어 ... 7 년 후 그리고 이것은 여전히 ​​저를
엉망으로 만드는

33

한 의견 아래 이미 게시 된 것처럼 나는 그것을 사용하여 해결했다.

app.use(require('connect').bodyParser());

대신에

app.use(express.bodyParser());

나는 왜 단순한 express.bodyParser()것이 작동 하지 않는지 여전히 모른다 ...


1
@Masiar 이것은 나를 위해 작동하지 않습니다. 나는 expressjs 4를 사용하고 있으며 이와 같은 오류가 발생합니다. 오류 : 'connect'모듈을 찾을 수 없습니다
Jeyarathnem Jeyachanthuru

1
@JeyTheva 광산은 꽤 오래된 솔루션이므로 그 동안 상황이 바뀔 수 있습니다. connect통해 모듈 을 설치 npm install connect하고 다시 시도하십시오. 이것은 오류의 출력을 읽음으로써 내가 생각할 수있는 유일한 것입니다.
Masiar

4
이 문제를 해결하기위한 최신 설명서는 다음과 같습니다. npmjs.com/package/body-parser 이 문제가 "포스트 익스프레스 4"인 다른 사람들을 위해 Content-Type헤더를 로 설정 했습니다 application/json.
Grant Eagon

3
이 문제를 해결하기위한 최신 설명서는 다음과 같습니다. npmjs.com/package/body-parser body-parser를 설치 한 후에도 여전히 작동하지 않습니다. 내가 한 일은 요청 Content-Typeapplication/json할 때 헤더를 설정하는 것이 었습니다.
Grant Eagon

1
application/jsontext/json요구 작품뿐만 @GrantEagon에 의해 제안했다.
strider

21
// Require body-parser (to receive post data from clients)

var bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({ extended: false }))

// parse application/json

app.use(bodyParser.json())

20

귀하의 추가 app.js

라우터의 호출 전에

const app = express();
app.use(express.json());

2
당신은 내 하루 남자를 구했다! 열쇠는 통화 라우터 앞에 라인을 추가하는 것입니다
ubaldisney

이 일은 저를 구했습니다. 감사합니다 :)
Farrukh Faizy

12

본문 파서가 더 이상 명시 적으로 제공되지 않는 것 같습니다. 별도로 설치해야 할 수도 있습니다.

var express    = require('express')
var bodyParser = require('body-parser')
var app = express()

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))

// parse application/json
app.use(bodyParser.json())

// parse application/vnd.api+json as json
app.use(bodyParser.json({ type: 'application/vnd.api+json' }))
app.use(function (req, res, next) {
console.log(req.body) // populated!

자세한 정보와 예제 는 git 페이지 https://github.com/expressjs/body-parser 를 참조 하십시오 .


1
이것은 새로운 Express 4.x 형식으로 보이며 나를 위해 일했습니다. 다른 답변에서 언급 한 express.bodyParser ()는 4.x에서 작동하지 않습니다.
DustinB

10

누군가 내가 겪었던 것과 같은 문제가 발생하는 경우; 나는 같은 URL 접두사를 사용하고 있습니다

http://example.com/api/

라우터로 설정되었습니다

app.use('/api', router); 

그리고 나는 다음을 가졌다

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

내 문제가 해결 된 이유는 위의 bodyparser 구성입니다. app.use('/api', router);

결정적인

// setup bodyparser
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: true }));

//this is a fix for the prefix of example.com/api/ so we dont need to code the prefix in every route
    app.use('/api', router); 

9

express.bodyParser ()는 구문 분석중인 컨텐츠 유형을 알려야합니다. 따라서 POST 요청을 실행할 때 "Content-Type"헤더가 포함되어 있는지 확인해야합니다. 그렇지 않으면 bodyParser가 POST 요청의 본문으로 수행 할 작업을 알지 못할 수 있습니다.

curl을 사용하여 본문에 일부 JSON 객체를 포함하는 POST 요청을 실행하는 경우 다음과 같습니다.

curl -X POST -H "Content-Type: application/json" -d @your_json_file http://localhost:xxxx/someRoute

다른 방법을 사용하는 경우 적절한 규칙을 사용하여 해당 헤더 필드를 설정하십시오.


8

app.use (bodyparser.json ())을 사용하십시오 . 라우팅하기 전에. //. app.use ( "/ api", 경로);



7

JSON 파서가 누락되어 req.body가 대부분 정의되지 않았습니다.

const express = require('express');
app.use(express.json());

본문 파서에 대해 누락 될 수 있습니다

const bodyParser  = require('body-parser');
app.use(bodyParser.urlencoded({extended: true}));

때로는 크로 원점으로 인해 정의되지 않으므로 추가하십시오.

const cors = require('cors');
app.use(cors())

5

이것은 오늘 나에게 일어났다. 위의 해결책 중 어느 것도 나를 위해 작동하지 않습니다. 그러나 약간의 인터넷 검색 으로이 문제를 해결하는 데 도움이되었습니다. wechat 타사 서버를 코딩하고 있습니다.

node.js 애플리케이션이 REST 클라이언트의 요청과 같은 스트리밍 POST 데이터를 읽어야하는 경우 상황이 약간 더 복잡해집니다. 이 경우 요청의 속성 "readable"이 true로 설정되고 모든 내용을 수집하려면 POST 데이터를 덩어리로 읽어야합니다.

http://www.primaryobjects.com/CMS/Article144


이 게시물은 REST 클라이언트 요청과 다른 HTML 양식 제출을 언급합니다. 둘 다 http 요청이 아니십니까? 따라서 POST는 스트리밍이 필요한 유일한 경우입니까?
j10

5

많은 시간을 낭비했습니다 :

클라이언트 요청
의 Content-Type에 따라 서버 는 아래 app.use () 중 하나와 달라야합니다.

app.use(bodyParser.text({ type: 'text/html' }))
app.use(bodyParser.text({ type: 'text/xml' }))
app.use(bodyParser.raw({ type: 'application/vnd.custom-type' }))
app.use(bodyParser.json({ type: 'application/*+json' }))

출처 : https://www.npmjs.com/package/body-parser#bodyparsertextoptions

예:

나를 위해, 클라이언트 측에서 헤더 아래에 있습니다.

Content-Type: "text/xml"

그래서 서버 측에서 다음을 사용했습니다.

app.use(bodyParser.text({type: 'text/xml'}));

그런 다음 req.body가 정상적으로 작동했습니다.



4

작업하려면 다음을 수행해야 app.use (app.router)(express.bodyParser ()) app.use , 같은 :

app.use(express.bodyParser())
   .use(express.methodOverride())
   .use(app.router);

1
귀하의 의견과 코드 스 니펫은 모순됩니다. 첫째로 당신은 당신이 사용해야하는 말 app.useapp.router전에 express.bodyParser하지만 코드가 명확의 AFTER를 나타냅니다. 그래서 어느 것입니까?
Levi Roberts

1
미안 해요 express.bodyParser 다음에 app.router를 사용해야합니다.
HenioJR

1
감사합니다 @LeviRoberts
HenioJR

4
var bodyParser = require('body-parser');
app.use(bodyParser.json());

이것은 나의 하루를 구했다.


4

body-parser ( link )를 사용하지 않았기 때문에이 문제가 발생할 수 있습니다.

var express = require('express');
var bodyParser  = require('body-parser');

var app = express();
app.use(bodyParser.json());

3

나는 그것을 해결했다 :

app.post('/', bodyParser.json(), (req, res) => {//we have req.body JSON
});

3

이것은 또한 하나의 가능성입니다 : app.js (또는 index.js) 파일에서 경로 전에이 코드를 작성해야합니다.

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

2

Express Body Parser를 사용할 수 있습니다.

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true }));

2

최신 버전의 Express에는 이미 본문 파서가 내장되어 있습니다. 따라서 다음을 사용할 수 있습니다.

const express = require('express);
... 
app.use(express.urlencoded({ extended: false }))
.use(express.json());

1

SOAP 메시지를 게시하는 경우 원시 구문 분석기를 사용해야합니다.

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

app.use(bodyParser.raw({ type: 'text/xml' }));

1

@ kevin-xue를 기반으로 콘텐츠 유형을 선언해야한다고 말했습니다. 내 경우에는 XDomainRequest가 콘텐츠 유형을 설정하지 않기 때문에 IE9에서만 발생했습니다. . 그래서 bodyparser와 expressjs는 요청의 본문을 무시했습니다.

요청을 본문 파서에 전달하기 전에 content-type을 명시 적으로 설정 하여이 문제를 해결했습니다.

app.use(function(req, res, next) {
    // IE9 doesn't set headers for cross-domain ajax requests
    if(typeof(req.headers['content-type']) === 'undefined'){
        req.headers['content-type'] = "application/json; charset=UTF-8";
    }
    next();
})
.use(bodyParser.json());

1

훌륭한 답변 을 위해 @spikeyang 에게 감사드립니다 (아래 제공). 게시물에 첨부 된 제안 기사를 읽은 후 솔루션을 공유하기로 결정했습니다.

언제 사용합니까?

이 솔루션을 사용하려면 고속 라우터를 사용해야합니다. 따라서 : 허용 된 답변을 운없이 사용하려고 시도한 경우이 기능을 복사하여 붙여 넣기 만하면됩니다.

function bodyParse(req, ready, fail) 
{
    var length = req.header('Content-Length');

    if (!req.readable) return fail('failed to read request');

    if (!length) return fail('request must include a valid `Content-Length` header');

    if (length > 1000) return fail('this request is too big'); // you can replace 1000 with any other value as desired

    var body = ''; // for large payloads - please use an array buffer (see note below)

    req.on('data', function (data) 
    {
        body += data; 
    });

    req.on('end', function () 
    {
        ready(body);
    });
}

다음과 같이 호출하십시오.

bodyParse(req, function success(body)
{

}, function error(message)
{

});

참고 : 큰 페이로드의 경우 배열 버퍼를 사용하십시오 ( 더 @MDN ).


bodyParser 패키지가 일반적으로 사용되며 페이로드를 본문 객체로 변환합니다. 다른 답변에 제공된
Schuere

1

외부 도구를 사용하여 요청하는 경우 헤더를 추가해야합니다.

Content-Type: application/json


이것은 내가 우편 배달부와 일하고 있었는데 도움이되었습니다. 친구 감사합니다.
R. Gurung

1

위의 답변 중 아무것도 응답하지 않은 사람은 프론트 엔드와 익스프레스 사이에 cors를 활성화해야했습니다.

다음 방법 중 하나로이 작업을 수행 할 수 있습니다.

  1. 다음과 같은 브라우저 용 CORS 확장 기능 다운로드 및 켜기 :

    https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=ko

    Chrome의 경우

또는

  1. 라인 추가

    var cors=require('cors');
    
    app.use(cors());

특급 app.js페이지로 (후 npm install cors)

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