programing

req.포스트에 비어있는 본문

mailnote 2023. 5. 21. 11:51
반응형

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 페이로드

내용 유형과 함께 보낼 때 작동한다는 것을 발견했습니다.

"응용 프로그램/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

반응형