게시물에 비어있는 req.body


255

갑자기 이것이 내 모든 프로젝트에서 일어나고 있습니다.

Express 및 body 파서를 사용하여 nodejs에 게시물을 만들 때마다 req.body빈 개체입니다.

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

var app = express()

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded())

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

app.listen(2000);

app.post("/", function (req, res) {
  console.log(req.body) // populated!
  res.send(200, req.body);
});

아약스와 우체부를 통해 항상 비어 있습니다.

그러나 컬을 통해

$ curl -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:2000/

의도 한대로 작동합니다.

나는 Content-type : application/json전자에서 수동으로 설정 을 시도했지만 항상400 bad request

이것은 나를 미치게했다.

바디 파서에서 업데이트 된 것으로 생각했지만 다운 그레이드되어 도움이되지 않았습니다.

도움을 주셔서 감사합니다.


16
그래서 Content-Type우편 배달부에서 명시 적으로 설정을 시도 했습니까? 그렇지 않은 경우 우편 배달부와 관련하여 이전에 문제가 있었으므로 시도해 볼 수 있습니다 Content-Type.
mscdex

그래, 내가 했어. 400을 받았을 때입니다 : 잘못된 json
Joseph Dailey

@mscdex-고마워 우편 배달부에서 콘텐츠 관을 설정하지 않고 미쳐지고 :)
Muzafar Ali

API에서 파일 을 보내거나 업로드 하고 양식 데이터를 사용해야하므로 여기에 오는 사람들에게 적합 합니다. 양식 데이터를 처리 할 무언가가 필요합니다. npmjs.com/package/multer 는 매우 인기있는 패키지입니다.
bhaskar

어쨌든 postman은 정수와 부동 소수점 값을 잘 처리하지 않습니다. 정수 또는 부동 소수점 값이있는 경우 키와 값 모두를 큰 따옴표로
묶어야

답변:


272

컨텐츠 유형에 사용 가능한 3 가지 옵션 중 Postman에서 "X-www-form-urlencoded"를 선택하면 작동합니다.

또한 오류 메시지를 제거하려면 다음을 수행하십시오.

app.use(bodyParser.urlencoded())

와:

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

참조 https://github.com/expressjs/body-parser를

'body-parser'미들웨어는 멀티 파트가 아닌 JSON 및 urlencoded 데이터 만 처리합니다.


그것은 우편 배달부에게 효과적이었습니다. 아무것도 변경하지 않았기 때문에 왜 그것이 아약스와 함께 작동하는지 잘 모르겠습니다.
Joseph Dailey

어떤 이유로 Angular를 통한 http 게시물은 URL 인코딩 될 필요는 없지만 ajax 호출은 필요했습니다. 아무도 이유를 아십니까?
youngrrrr

이것은 나를 위해 일했는데 왜 원시 인코딩으로 작동하지 않았습니까?
Daniel Kobe

9
이제 body-parser는 app.use(express.json());
express.js로

정말 고맙습니다! 오랜 시간이 걸렸음에도 불구하고 여전히 관련이 있습니다.
스프레이 앤 프라이

218

Postman을 사용하여 원시 JSON 데이터 페이로드로 HTTP 사후 조치를 테스트하려면 raw옵션을 선택 하고 다음 헤더 매개 변수를 설정하십시오.

Content-Type: application/json

또한 JSON 페이로드에서 키 / 값으로 사용 된 모든 문자열을 큰 따옴표로 묶어야합니다.

body-parser패키지는 잘 멀티 라인 원시 JSON 페이로드를 구문 분석합니다.

{
    "foo": "bar"
}

아래 설정으로 Postman v0.8.4.13 확장 ( body-parserv1.12.2 및 expressv4.12.3)을 사용하여 Chrome v37 및 v41에서 테스트되었습니다 .

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

// configure the app to use bodyParser()
app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(bodyParser.json());

// ... Your routes and methods here

우편 배달부 원시 JSON 페이로드


오, 어떻게 올바른 형식의 JSON 객체 대신 JS 객체 리터럴을 붙여 넣었는지 놓쳤습니까? : -S ... 감사합니다 친구!
Wes Johnson

큰 따옴표로 키 / 값으로 사용 된 모든 문자열 감싸기 ... 놓치기 쉽지만 그렇지 않으면 전체 거래 차단기! 감사합니다.
loxyboi

스크린 샷을 잘 사용하십시오.
Xan-Kun Clark-Davis

form-dataPostman에서 데이터를 게시 할 때 항상 {}req.body에 넣습니다. Content-Type옵션을 설정해야합니까 ?
mingchau

56

나는 정말 바보 같은 실수를했고 name내 HTML 파일의 입력 속성 을 정의하는 것을 잊었다 .

그래서 대신

<input type="password" class="form-control" id="password">

나는 이것을 가지고있다.

<input type="password" class="form-control" id="password" name="password">

이제 다음 request.body과 같이 채워집니다.{ password: 'hhiiii' }


1
밤. 그게 문제였습니다. 감사!
매트 웨스트

그것은 정확히 내 문제, 이름 값이없는 양식 입력으로 알아 내려고 몇 시간을 보냈습니다. 감사.
karensantana

37

콘텐츠 유형으로 보낼 때 작동한다는 것을 발견했습니다.

"application / json"

서버 측과 결합

app.use(bodyParser.json());

이제를 통해 보낼 수 있습니다

var data = {name:"John"}
var xmlHttp = new XMLHttpRequest();
xmlHttp.open("POST", theUrl, false); // false for synchronous request
xmlHttp.setRequestHeader("Content-type", "application/json");
xmlHttp.send(data);

결과는 request.body.name서버 에서 사용할 수 있습니다 .


공감에 감사드립니다. 어쨌든 올바른 내용 유형을 보내야하므로 가장 간단한 해결책은 아니지만 이것이 가장 깨끗하다고 ​​생각합니다. 내 생각에
Xan-Kun Clark-Davis

이것이 답입니다!

제 경우에는 다음과 같이 변경해야했습니다xmlHttp.send(JSON.stringify(data));
endo64

18

오늘이 문제에 부딪 쳤 으며 Postman에서 콘텐츠 유형 헤더제거하는 문제가 해결되었습니다 ! 아주 이상한. 누군가를 돕기 위해 여기에 추가하십시오.

여기에서 BeerLocker 튜토리얼을 따르고 있습니다 : http://scottksmith.com/blog/2014/05/29/beer-locker-building-a-restful-api-with-node-passport/


2
나는 같은 문제가 있었다. 헤더가 "체크되지 않은"(회색으로 표시됨) 충분하지 않으므로 완전히 제거해야했습니다. "</>"소스 단추에 Content-Type이 선택되지 않은 상태로 해당 헤더를 보내지 않았 음을 표시하더라도 여전히 완전히 제거해야했습니다.
TheRemix

우편 배달부 크롬 확장 프로그램에서 기본 헤더를 제거하는 방법을 알 수 없습니다 ... 앱을 사용하고 있습니까?
WestleyArgentum

오, 나는 응용 프로그램을 설치했으며 확장보다 훨씬 잘 작동합니다. 소음이 유감입니다.
WestleyArgentum

12

본문 파서 미들웨어가 요청 유형 (json, urlencoded)으로 올바르게 설정되어 있는지 확인해야합니다.

설정 한 경우

app.use(bodyParser.json());

그런 다음 우편 배달부에서 데이터를 원시로 보내야합니다.

https://i.stack.imgur.com/k9IdQ.png 우편 배달부 스크린 샷

설정 한 경우

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

그런 다음 'x-www-form-urlencoded'옵션을 선택해야합니다.


둘 다 갖는 것은 어떻습니까? (bodyParser.urlencoded 및 bodyParser.json ()) ... 우편 배달부에서 사용할 수있는 것은 무엇입니까?
TommyLeong

9

내 문제는 내가 경로를 먼저 만드는 것이 었습니다

// ...
router.get('/post/data', myController.postHandler);
// ...

그리고 경로 후에 미들웨어를 등록

app.use(bodyParser.json());
//etc

앱 구조 및 예제로 프로젝트를 복사하여 붙여 넣기 때문입니다.

라우트 전에 미들웨어 등록 명령을 수정하면 모두 작동했습니다.


올바른 순서와 원시 탭을 사용하여 감사 피아트, 마침내 나를 위해 일했다
Alex

4

내가 웹 응용 프로그램을 통해 그것을 배우기 시작한 처음으로 node.js를 배우고 있었을 때에도, 나는이 모든 것들을 내 방식으로 잘 수행했지만 여전히 포스트 요청에서 값을받을 수 없었습니다. 긴 디버깅 후, 나는 내가 제공 한 형태 enctype="multipart/form-data"로 값을 얻을 수 없다는 것을 알게되었습니다. 나는 단순히 그것을 제거하고 그것은 나를 위해 일했다.


네, 이것은 또한 폼 바디를 얻기 위해 일 했지만 내 폼에 또 다른 문제를 일으켰습니다. 기본적으로 파일이 필요에 따라 업로드 할 수 없었습니다enctype="multipart/form-data"
tsando

btw, 위의 의견에 추가하기 위해이 작업을 수행 multer했습니다. npmjs.com/package/multer에
tsando

3

encType을 사용하지 않으면 (기본값은 application/x-www-form-urlencoded) 텍스트 입력 필드는 얻지 만 파일은 얻지 못하는 것 같습니다.

텍스트 입력 및 파일을 게시하려는 양식이있는 경우 multipart/form-data인코딩 유형과 multer미들웨어 를 사용하십시오 . Multer는 요청 객체를 구문 분석하고 req.file사용자를 준비 하며 다른 모든 입력 필드 는를 통해 사용할 수 있습니다 req.body.


1
감사합니다- multer실제로 내 문제에 대한 해결책이었습니다. 이것을 답변의 일부로 사용하는 방법에 대한 예를 추가 할 수 있다면 좋을 것입니다
tsando

2

비슷한 문제가 발생했습니다. 콜백 매개 변수의 순서를 간단히 혼합했습니다. 콜백 기능을 올바른 순서로 설정하고 있는지 확인하십시오. 적어도 같은 문제가있는 사람에게는.

router.post('/', function(req, res){});

2

[ "key": "type", "value": "json"] & [ "key": "Content-Type", "value": "application / x-www-form-urlencoded"]가 우편 배달부 요청 헤더


2

multer위에서 제안한 대로이 문제를 해결 했지만이를 수행하는 방법에 대한 완전한 실례를 제공하지 못했습니다. 기본적으로이 작업은와 양식 그룹이있을 때 발생할 수 있습니다 enctype="multipart/form-data". 내가 가진 양식의 HTML은 다음과 같습니다.

<form action="/stats" enctype="multipart/form-data" method="post">
  <div class="form-group">
    <input type="file" class="form-control-file" name="uploaded_file">
    <input type="text" class="form-control" placeholder="Number of speakers" name="nspeakers">
    <input type="submit" value="Get me the stats!" class="btn btn-default">            
  </div>
</form>

그리고 여기에 사용하는 방법 multer으로이 양식의 값과 이름을 얻을 Express.js하고 node.js:

var multer  = require('multer')
var upload = multer({ dest: './public/data/uploads/' })
app.post('/stats', upload.single('uploaded_file'), function (req, res) {
   // req.file is the name of your file in the form above, here 'uploaded_file'
   // req.body will hold the text fields, if there were any 
   console.log(req.file, req.body)
});

1

몇 분 전에 같은 문제가 있었지만 위의 답변에서 가능한 모든 것을 시도했지만 그중 하나가 작동했습니다.

내가 한 유일한 일은 Node JS 버전을 업그레이드하는 것이 었습니다. 업그레이드가 무언가에 영향을 줄 수 있다는 것을 몰랐습니다.

Node JS 버전 10.15.0(최신 버전)을 설치 8.11.3했으며 돌아 왔고 모든 것이 작동합니다. 어쩌면 body-parser모듈 이이 문제를 해결해야합니다.


1

입력에 이름이 없었습니다 ... 요청이 비어있었습니다 ... 완료되어 코딩을 계속할 수 있습니다. 모두 감사합니다!

Jason Kim이 사용한 답변 :

그래서 대신

<input type="password" class="form-control" id="password">

나는 이것을 가지고있다

<input type="password" class="form-control" id="password" name="password">

1

JSON.stringify(data)아래와 같이 AJAX를 통해 전송 하는 동안 하지 말아야 합니다.

이것은 올바른 코드가 아닙니다 :

function callAjax(url, data) {
    $.ajax({
        url: url,
        type: "POST",
        data: JSON.stringify(data),
        success: function(d) {
            alert("successs "+ JSON.stringify(d));
        }
    });
}   

올바른 코드는 다음과 같습니다.

function callAjax(url, data) {
    $.ajax({
        url: url,
        type: "POST",
        data: data,
        success: function(d) {
            alert("successs "+ JSON.stringify(d));
        }
    });
}

여기서 주목할 점은 유형에서 "POST"를 대문자로 입력해야한다는 것입니다. 방금 "post"를 사용하여 빈 req.body가 발생하는 경우를 보았습니다.
Matt C.

1

우편 배달부와 함께하는 경우 API를 요청할 때 이러한 사항을 확인하십시오.

여기에 이미지 설명을 입력하십시오


0

Express 대신 restify를 사용하고 동일한 문제가 발생했습니다. 해결책은 다음과 같습니다.

server.use(restify.bodyParser());


0

app.use(bodyParser.urlencoded());코드 변경

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

우편 배달부에서 헤더 변경 Content-Type값을 application/x-www-form-urlencoded에서application/json

고마워:-)


0

큰 답변을 주셔서 감사합니다! 해결책을 찾는 데 꽤 오랜 시간을 보냈고 내 측면에서 나는 기본적인 실수를하고 있었다 : 나는 bodyParser.json()함수 내에서 전화 했다.

app.use(['/password'], async (req, res, next) => {
  bodyParser.json()
  /.../
  next()
})

방금 app.use(['/password'], bodyParser.json())할 일 이 있었고 효과가있었습니다 ...


0

우체부에서는 수락 된 답변을 따른 후에도 빈 요청 본문을 얻었습니다. 이 문제는이라는 헤더를 전달하지 않는 것으로 나타났습니다.

Content-Length : <calculated when request is sent>

이 헤더는 기본적으로 (다른 5 개와 함께) 비활성화되어 있습니다. 이것을 사용하면 요청 본문을 받게됩니다.


0

내 문제는 먼저 경로를 만드는 require("./routes/routes")(app); 것이 었습니다. 전에 코드의 끝으로 옮겼습니다 app.listen .

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