req.포스트에 비어있는 본문
갑자기 제 모든 프로젝트에 이런 일이 일어났습니다.
body-parser를 을 만들 마다 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ 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/
의도한 대로 작동합니다.
으로 수으로설보았니다습해정동▁setting다▁manually니를 설정해 보았습니다.Content-type : application/json전자에서는 그러나 나는 항상.400 bad request
이것 때문에 미치겠어요.
바디 파서에 뭔가 업데이트가 된 줄 알았는데 다운그레이드를 했더니 도움이 안 됐어요.
어떤 도움이든 감사합니다.
내용 유형에 사용할 수 있는 세 가지 옵션 중 우편 배달부에서 "X-www-form-urlenced"를 선택하면 작동합니다.
오류 메시지를 제거하려면 대체:
app.use(bodyParser.urlencoded())
포함:
app.use(bodyParser.urlencoded({
extended: true
}));
https://github.com/expressjs/body-parser 을 참조하십시오.
'body-parser' 미들웨어는 JSON 및 URL 인코딩 데이터만 처리하며 멀티파트는 처리하지 않습니다.
@Sujeet Agrahari가 언급했듯이 바디 파서는 현재 express.js와 함께 내장되어 있습니다.
사용하다app.use(express.json());JSON 본문에 대한 최신 버전에서 이를 구현합니다.된 본문 POST에서은 URL " " " (HTTP 형식 POST") " " 를 사용합니다.app.use(express.urlencoded());
페이로드로 하려면 포트맨을원시사JSON데페로HTTP포스면다를 합니다.raw옵션을 선택하고 다음 헤더 매개 변수를 설정합니다.
Content-Type: application/json
또한 JSON 페이로드에서 키/값으로 사용되는 문자열은 큰따옴표로 묶어야 합니다.
패키지는 여러 줄의 원시 JSON 페이로드를 잘 구문 분석할 것입니다.
{
"foo": "bar"
}
아래 설정에서 포스트맨 v0.8.4.13 body-parser확장(v1.12.2 및 v4.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"
와
app.use(express.json())
은 사용할 입니다.) (@marcelocra 지적듯년이했가것, 2022년 버전)
고용으이전버전로참▁for)버전
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서버에 있습니다.
내가 정말 바보 같은 실수를 했고 정의하는 것을 잊었습니다.name내 html 파일의 입력에 대한 속성.
그래서 대신에
<input type="password" class="form-control" id="password">
나는 이것을 가지고 있다.
<input type="password" class="form-control" id="password" name="password">
지금이다request.body다음과 됩니다.{ password: 'hhiiii' }
바디 파서 미들웨어가 요청 유형(json, urlencoded)으로 올바르게 설정되었는지 확인해야 합니다.
만약 당신이 정했다면,
app.use(bodyParser.json());
그런 다음 우체부에서 당신은 데이터를 원시로 보내야 합니다.
https://i.stack.imgur.com/k9IdQ.png 우체부 스크린샷
만약 당신이 정했다면,
app.use(bodyParser.urlencoded({
extended: true
}));
그런 다음 'x-www-form-urlenced' 옵션을 선택해야 합니다.
저는 오늘 이 문제에 부딪혔고, 그것을 해결한 것은 포스트맨에서 내용 유형 헤더를 제거하는 것이었습니다!매우 이상합니다.누군가에게 도움이 될 경우를 대비하여 여기에 추가합니다.
여기서 BeerLocker 튜토리얼을 따르고 있었습니다. http://scottksmith.com/blog/2014/05/29/beer-locker-building-a-restful-api-with-node-passport/
만약 당신이 우체부와 함께 한다면 API를 요청할 때 이것들을 확인해주세요.
Express 4.16+의 경우 본문 파서를 설치할 필요가 없습니다. 다음을 사용하십시오.
const express = require('express');
const app = express();
app.use(express.json());
app.post('/your/path', (req, res) => {
const body = req.body;
...
}
제 문제는 제가 먼저 경로를 만드는 것이었습니다.
// ...
router.get('/post/data', myController.postHandler);
// ...
경로 후 미들웨어 등록
app.use(bodyParser.json());
//etc
앱 구조 및 복사 및 예제에서 프로젝트를 함께 붙여넣기 때문입니다.
일단 경로 전에 미들웨어를 등록하라는 주문을 고치고 나니 모든 것이 작동했습니다.
익스프레스 4.17.1
미들웨어의 는 이와같미 예다같습이 없는 입니다.bodyParser;
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
GET를 요청하는 경우 헤더는 다음과 같아야 합니다;
{'Content-Type': 'application/json'}
POST를 요청하는 경우 헤더는 다음과 같아야 합니다;
{'Content-Type': 'application/x-www-form-urlencoded'}
저는 이런 간단한 기능을 클라이언트 쪽에서 사용하고 있습니다.
async function _GET(api) {
return await (await fetch(api, {
method: 'GET',
mode: 'no-cors',
cache: 'no-cache',
credentials: 'same-origin',
headers: {
'Content-Type': 'application/json; charset=utf-8',
'Connection': 'keep-alive',
'Accept': '*',
},
})).json();
};
async function _POST (api, payload) {
return await (await fetch(api, {
method: 'POST',
mode: 'no-cors',
cache: 'no-cache',
credentials: 'same-origin',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Connection': 'keep-alive',
'Accept': '*/*',
},
body: new URLSearchParams(payload),
})).json();
};
우체부에서, 저는 수락된 답변을 따르고도 빈 요청 본문을 받고 있었습니다.문제는 다음 헤더를 전달하지 않는 것으로 나타났습니다.
Content-Length : <calculated when request is sent>
이 헤더는 기본적으로 5개의 다른 헤더와 함께 사용하지 않도록 설정했습니다.이 옵션을 선택하면 요청 본문이 수신됩니다.
우체부 요청 시 오류 원본이 특정 헤더 유형을 정의하지 않습니다.저는 간단히 다음과 같이 추가하여 해결했습니다.
Content-Type: application/json
또는 요청을 하는 동안 우편 배달부에서 원시 데이터 유형을 JSON으로 명시적으로 정의하는 것도 문제를 해결합니다.
웹앱을 통해 처음으로 node.js를 배우기 시작했을 때도 이 모든 것을 제 형태로 잘 처리하고 있었지만, 여전히 게시 요청에서 값을 받을 수 없었습니다.오랜 디버깅 끝에 제가 제공한 양식에서 알게 되었습니다.enctype="multipart/form-data"그로 인해 저는 가치를 얻을 수 없었습니다.저는 간단히 그것을 제거했고 그것은 저에게 효과가 있었습니다.
는 이것을 여하해결다니습했사를 했습니다.multer위에서 제안한 것처럼, 그러나 그들은 이것을 어떻게 하는지에 대한 완전한 작동 예시를 제공하지 못했습니다.에▁with▁group가 있는 형태의 그룹이 때 할 수 .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)
});
우체부 요청 헤더에 ["key": "type", "value": "json"] 및 ["key": "Content-Type", "value": "application/x-www-form-urlenced"]가 있는지 확인합니다.
encType을 사용하지 않는 것 같습니다(기본값은application/x-www-form-urlencoded그러면 텍스트 입력 필드는 표시되지만 파일은 표시되지 않습니다.
텍스트 입력과 파일을 게시할 양식이 있는 경우multipart/form-data인코딩 유형 및 그 용도에 추가multer미들웨어Multer가 요청 개체를 구문 분석하고 준비합니다.req.file사용자 및 기타 모든 입력 필드는 다음을 통해 사용할 수 있습니다.req.body.
이것이 해결할 수 있다고 믿습니다.app.use(express.json());
프런트 엔드에서 양식의 엔타이프를 변경하여 이 문제를 해결했습니다.
- ⛔였습니다.
<form enctype="multipart/form-data"> - ✅을 위해 바꿨습니다.
<form enctype="application/json">
결국 콘솔에 데이터가 팝업되는 것을 보니 안심이 되었습니다 ^^
비슷한 문제가 저에게 발생했습니다. 저는 단순히 콜백 매개변수의 순서를 섞었습니다.콜백 기능을 올바른 순서로 설정하고 있는지 확인합니다.적어도 같은 문제를 가진 사람들에게는요.
router.post('/', function(req, res){});
입력에 이름이 없습니다. 요청이 비어 있습니다.그것이 끝나서 다행이고 나는 코딩을 계속할 수 있습니다.여러분 감사합니다!
Jason Kim이 사용한 답변:
그래서 대신에
<input type="password" class="form-control" id="password">
나는 이것을 가지고 있다.
<input type="password" class="form-control" id="password" name="password">
몇 분 전에도 같은 문제가 있었습니다. 위의 답변에서 가능한 모든 방법을 시도했지만 모두 성공했습니다.
제가 한 유일한 일은 Node JS 버전을 업그레이드한 것입니다. 업그레이드가 영향을 줄 수 있는지 몰랐지만 영향을 미쳤습니다.
Node JS 버전을 설치했습니다.10.15.0(최신 버전)으로 돌아갑니다.8.11.3이제 모든 것이 작동하고 있습니다.아마도요.body-parser모듈에서 이 문제를 해결해야 합니다.
하면 안 됩니다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));
}
});
}
내 문제는 먼저 경로를 만드는 것이었습니다.require("./routes/routes")(app);▁▁to 앞의 코드 .app.listen그리고 그게 효과가 있었어!
양식에 파일 업로드 입력이 없는 경우 양식 태그에서 encytype 속성을 제거했는지 확인합니다.
enctype='multipart/form-data
express 및 body-parser 모두에 대해 app.use()의 .json() 또는 .urlencode()를 제거하는 것만으로 문제를 해결했습니다.이 간단한 솔루션으로 스트리밍을 다시 생성하는 코드를 작성했습니다.
app.post('/mypath',function(req,res){
data=""
// we can access HTTP headers
req.on('data', chunk => {
data+=chunk
})
req.on('end', () => {
console.log(data)
// here do what you want with data
// Eg: js=JSON.parse(data)
})
}
저는 express 대신 retify를 사용하다가 같은 문제에 부딪혔습니다.해결책은 다음과 같습니다.
server.use(restify.bodyParser());
app.use(bodyParser.urlencoded());의 코드에서 의에규따라정으로.
app.use(bodyParser.urlencoded({extended : false}));
postman에서는 에서 그고우 서에부서변에, 헤더경체리.Content-Type부터의 가치로에서 .application/x-www-form-urlencodedapplication/json
Ta:-)
여러의훌 답모감두다니립드사에변! 데 꽤 했고, 내를 하고 .해결책을 찾는 데 상당한 시간이 걸렸고, 저는 기본적인 실수를 하고 있었습니다.전화하고 있었어요bodyParser.json()에서: 함수내에서:
app.use(['/password'], async (req, res, next) => {
bodyParser.json()
/.../
next()
})
난 그저 할 필요가 있었습니다.app.use(['/password'], bodyParser.json())그리고 그것은 효과가 있었습니다.
제 경우에는 Fetch API를 사용하여 POST 요청을 전송하고 본문에서는 문자열 대신 객체를 전송하고 있었습니다.
실수> ->{ body: { email: 'value' } }
하였습니다 -> 본문끈묶어수서정니다습했으 ->{ body: JSON.stringify({ email: 'value' }) }
빠른 입력 - 동일한 문제(불면증으로 개인 api 테스트)가 있었는데 컨텐츠 유형: application/json을 추가하자 즉시 작동했습니다.저를 혼란스럽게 했던 것은 GET 및 POST 요청에 대해 거의 동일한 방식으로 모든 작업을 수행했지만 PUT이 작동하지 않는 것 같습니다.저는 정말로 이것이 누군가를 디버깅의 토끼굴에서 벗어나게 해주기를 바랍니다!
언급URL : https://stackoverflow.com/questions/24543847/req-body-empty-on-posts
'programing' 카테고리의 다른 글
| 연결 uri / url과 함께 pg_dump를 사용하는 방법은 무엇입니까? (0) | 2023.05.21 |
|---|---|
| Xcode iOS 프로젝트는 "My Mac 64-bit"만 표시하고 시뮬레이터나 장치는 표시하지 않습니다. (0) | 2023.05.21 |
| .NET의 두 바이트 배열 비교 (0) | 2023.05.21 |
| 잠시 동안 루프에서 tqdm 진행 표시줄 사용 (0) | 2023.05.21 |
| 시트를 삭제하고 대신 사용자 지정 메시지를 사용하여 Excel이 사용자에게 확인을 요청하지 않도록 합니다. (0) | 2023.05.21 |
