POST 쿼리 매개 변수를 검색하는 방법은 무엇입니까?


768

여기 내 간단한 양식이 있습니다.

<form id="loginformA" action="userlogin" method="post">
    <div>
        <label for="email">Email: </label>
        <input type="text" id="email" name="email"></input>
    </div>
<input type="submit" value="Submit"></input>
</form>

Express.js /Node.js 코드 는 다음과 같습니다 .

app.post('/userlogin', function(sReq, sRes){    
    var email = sReq.query.email.;   
}

나는 sReq.query.email또는 sReq.query['email']또는 sReq.params['email']등등을 시도했다 . 그들 중 어느 것도 효과가 없다. 그들은 모두 돌아온다 undefined.

Get call로 변경하면 작동하므로 .. 어떤 아이디어?


33
보안 : bodyParser()여기에서 답변을 사용 하는 모든 사람 은 아래
@SeanLynch

본문 파서 모듈을 사용하십시오 . 다음은 body-parser의
유용한

답변:


1251

Express 4.16.0 부터 상황이 다시 변경 되었으므로 이제 Express 3.0 에서 express.json()express.urlencoded()마찬가지로 사용할 수 있습니다 .

이이었다 다른 시작 4.15에 익스프레스 4.0 :

$ npm install --save body-parser

그리고:

var bodyParser = require('body-parser')
app.use( bodyParser.json() );       // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
  extended: true
})); 

나머지는 Express 3.0과 같습니다.

먼저 본문의 게시물 데이터를 구문 분석하려면 미들웨어를 추가해야합니다.

다음 코드 줄 중 하나 또는 둘 다를 추가하십시오.

app.use(express.json());       // to support JSON-encoded bodies
app.use(express.urlencoded()); // to support URL-encoded bodies

그런 다음 핸들러에서 req.body객체를 사용하십시오 .

// assuming POST: name=foo&color=red            <-- URL encoding
//
// or       POST: {"name":"foo","color":"red"}  <-- JSON encoding

app.post('/test-page', function(req, res) {
    var name = req.body.name,
        color = req.body.color;
    // ...
});

사용을 express.bodyParser()권장하지 않습니다.

app.use(express.bodyParser());

... 다음과 같습니다 :

app.use(express.json());
app.use(express.urlencoded());
app.use(express.multipart());

에 보안 문제가 express.multipart()있으므로 필요한 특정 인코딩 유형에 대한 지원을 명시 적으로 추가하는 것이 좋습니다. 멀티 파트 인코딩이 필요한 경우 (예를 들어 파일 업로드를 지원하기 위해)이 내용을 읽어야합니다 .


76
이 답변이 제대로 작동하지 않으면 다음과 같이 content-type헤더를 설정 하십시오 .curl -d '{"good_food":["pizza"]}' -H 'content-type:application/json' "http://www.example.com/your_endpoint"
SooDesuNe

6
이름 / 값 쌍으로 양식을 게시하는 것과 JSON 본문을 게시하는 것의 차이점은 무엇입니까? 둘 다 req.body에 표시됩니까?
chovy

7
@ chovy 예, 그렇습니다. bodyParserJSON, URL 인코딩 및 멀티 파트 데이터를 req.body객체 로 추상화 합니다.
Kristján

7
이 코드는 미들웨어가 더 이상 Express와 번들로 제공되지 않으므로 오류를 발생 시켰습니다. body-parser를 사용해야합니다 : github.com/senchalabs/connect#middleware
araneae

11
Express 4를 사용하여 json을 읽으려면 app.use(require('body-parser').json())행만으로 충분합니다. 그런 다음 요청의 본문 객체, 즉 req.body경로 정의 내 에서 json 데이터를 읽을 수 있습니다 .
Martin Carel

90

express.bodyParser ()를 사용하는 보안 문제

다른 모든 답변은 현재 사용하는 것이 좋습니다 동안 express.bodyParser()미들웨어,이 실제로 주위의 래퍼입니다 express.json(), express.urlencoded()그리고 express.multipart()미들웨어 ( http://expressjs.com/api.html#bodyParser ). 양식 요청 본문의 구문 분석은 express.urlencoded()미들웨어에 의해 수행되며 req.body오브젝트에 양식 데이터를 노출하는 데 필요한 모든 것입니다 .

인해에 보안 문제 방법에 express.multipart()/ connect.multipart(), 이제 모든 업로드 된 파일의 임시 파일을 생성 (쓰레기는 수집되지 않습니다) 권장 사용하지 express.bodyParser()래퍼를 대신 단지 당신이 필요로하는 미들웨어를 사용합니다.

참고 : connect.bodyParser()곧만을 포함하도록 업데이트됩니다 urlencodedjson연결 3.0 (Express가 확장되는) 해제 될 때.


간단히 말해, 대신에 ...

app.use(express.bodyParser());

... 사용해야합니다

app.use(express.urlencoded());
app.use(express.json());      // if needed

멀티 파트 양식 (파일 업로드)을 처리해야하는 경우, 타사, 버스 보이, 다이 서 등과 같은 타사 라이브러리 또는 미들웨어를 사용하십시오.


더 많은 사람들이 귀하의 우려와 조언을 볼 수 있도록 질문 아래에 의견을 추가했습니다. Andrew Kelley 블로그 에 다른 솔루션이 자세하게 설명되어 있습니까? (다른 사람들에게 물어 보면, 내 필요는 순전히 내부 도구입니다 ^^)
FelipeAls

@FelipeAls-예, Andrew의 게시물도 참조했습니다. 이러한 제안 (각각의 단점을 고려한)은 모두 관련이 있습니다.
Sean Lynch

또한, 연결 3.0 번 포함하지 않고 출시 multipart()의 일환으로 bodyParser(), bodyParser()"안전"을 다시하게하지만, 명시 적으로 타사 라이브러리를 사용하여 다중 지원을 활성화하는 방법이 필요합니다.
Sean Lynch

84

참고 :이 답변은 Express 2에 해당 합니다. Express 3에 대해서는 여기 를 참조 하십시오 .

connect / express를 사용하는 경우 bodyParser 미들웨어를 사용해야합니다 . Expressjs 안내서에 설명되어 있습니다.

// example using express.js:
var express = require('express')
  , app = express.createServer();
app.use(express.bodyParser());
app.post('/', function(req, res){
  var email = req.param('email', null);  // second parameter is default
});

원래 연결 전용 버전은 다음과 같습니다.

// example using just connect
var connect = require('connect');
var url = require('url');
var qs = require('qs');
var server = connect(
  connect.bodyParser(),
  connect.router(function(app) {
    app.post('/userlogin', function(req, res) {
      // the bodyParser puts the parsed request in req.body.
      var parsedUrl = qs.parse(url.parse(req.url).query);
      var email = parsedUrl.email || req.body.email;;
    });
  })
);

쿼리 문자열과 본문은 하위 수준 라이브러리 대신 Rails 스타일의 매개 변수 처리 ( qs)를 사용하여 구문 분석됩니다 . 로 반복되는 매개 변수를 구문 분석 하려면 매개 변수에 대괄호가 있어야 합니다. 또한 중첩 맵을 지원합니다. bodyParser는 HTML 양식 제출 구문 분석 외에도 JSON 요청을 자동으로 구문 분석 할 수 있습니다.querystringqsname[]=val1&name[]=val2

편집 : express.js를 읽고 Express 사용자에게 더 자연스러운 답변을 수정했습니다.


음 알았어. bodyParser ()를 시도하십시오. 의사가 req.query ()에서 가져올 수 있다고 말했지만 아무것도 얻지 못했습니다. 매우 이상합니다. Get tho에는 문제가 없습니다.
murvinlai

3
아니요, req.query는 GET 매개 변수입니다. req.body를 통해 POST 데이터를 얻습니다. req.params () 함수는 둘 다 포함합니다.
yonran

방황하는 클릭으로이 답변을 실수로 다운 통지하지 않았습니다. 이제 StackOverflow에서 변경할 수 없습니다. Esp. 도움이되었으므로 실망 스럽습니다 ... 나는 그것을 보완하기 위해 명시 적으로 찾지 않았던 다른 좋은 대답을 찬성했습니다. :)
HostileFork는 SE

33

미들웨어없이 게시 된 쿼리를 작성하려는 경우이 작업을 수행합니다.

app.post("/register/",function(req,res){
    var bodyStr = '';
    req.on("data",function(chunk){
        bodyStr += chunk.toString();
    });
    req.on("end",function(){
        res.send(bodyStr);
    });

});

브라우저로 전송합니다

email=emailval&password1=pass1val&password2=pass2val

그래도 미들웨어를 사용하는 것이 좋을 것이므로 각 경로에서 이것을 반복해서 쓸 필요가 없습니다.


3
조만간 더 이상 사용되지 않을 라이브러리에 의존하고 싶지 않은 사람들을위한 sooo .. 편리함
Daniel

자신 만의 미들웨어를 쉽게 구축 할 수 있습니다
maioman

이것은 훌륭한 답변이지만 "---------------------------- 359856253150893337905494 내용 텍스트 : name-data; name = "fullName"Ram ---------------------------- 359856253150893337905494-- "해당 번호를 원하지 않습니다.
Nawaraj

25

Express 4 사용자를위한 참고 사항 :

당신이 시도하고 넣어 경우 app.use(express.bodyParser());귀하의 응용 프로그램에 당신이 당신의 Express 서버를 시작하려고하면 다음과 같은 오류가 발생합니다 :

오류 : bodyParser와 같은 대부분의 미들웨어는 더 이상 Express와 번들로 제공되지 않으며 별도로 설치해야합니다. https://github.com/senchalabs/connect#middleware를 참조 하십시오 .

npmbody-parser별도로 패키지를 설치 한 후 다음과 같은 것을 사용해야 합니다 (GitHub 페이지 에서 가져온 예 ).

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

var app = express();

app.use(bodyParser());

app.use(function (req, res, next) {
  console.log(req.body) // populated!
  next();
})

이 정보에 대단히 감사합니다. bodyParser를 사용하는 새로운 방법을 다루기 위해 머리카락을 뽑아 내고있었습니다! 이것은 큰 돌파구였습니다-정말로 감사합니다
Tommy

1
heplp : body-parser 지원 중단 bodyParser : 개별 json / urlencoded 미들웨어 사용
Mohammad Faizan khan

19

주어진 형태 :

<form action='/somepath' method='post'>
   <input type='text' name='name'></input>
</form>

급행 사용

app.post('/somepath', function(req, res) {

    console.log(JSON.stringify(req.body));

    console.log('req.body.name', req.body['name']);
});

산출:

{"name":"x","description":"x"}
req.param.name x

6
나를 위해 일하지 않았다. app.use (express.bodyParser ())를 사용해야합니다.
cawecoy 2016 년

@cawecoy 절대적으로 여기에 동일하지만 express.bodyParser () 나에게 잘 작동하지 않습니다
Mohammad Faizan khan

@MohammadFaizankhan 그것은 실험적인 일이었고 더 이상 표현을 사용하지 않았으며 지금은 도울 수 없습니다. Google은 비슷한 기능을 사용하여 express.bodyParser ()를 수행합니다. 행운을 빕니다!
cawecoy

16

백엔드 :

import express from 'express';
import bodyParser from 'body-parser';

const app = express();
app.use(bodyParser.json()); // add a middleware (so that express can parse request.body's json)

app.post('/api/courses', (request, response) => {
  response.json(request.body);
});

프론트 엔드 :

fetch("/api/courses", {
  method: 'POST',
  body: JSON.stringify({ hi: 'hello' }), // convert Js object to a string
  headers: new Headers({ "Content-Type": "application/json" }) // add headers
});

15
app.use(express.bodyParser());

그런 다음을 통해 app.post요청 값을 얻을 수 있습니다 req.body.{post request variable}.


귀하의 게시물 요청 변수는 해당 입력 필드의 ID 또는 전체 형식입니까?
Eogcloud

2
express.bodyParser ()는 더 이상 사용되지 않습니다. 답변 업데이트
Mohammad Faizan khan

15

Express 4.4.1 용 업데이트

Express에서 다음의 미들웨어가 제거되었습니다.

  • bodyParser
  • json
  • urlencoded
  • 여러 부분

express 3.0에서와 같이 미들웨어를 직접 사용하는 경우 다음과 같은 오류가 발생합니다.

Error: Most middleware (like urlencoded) is no longer bundled with Express and 
must be installed separately.


이러한 미들웨어를 활용하려면 각 미들웨어마다 npm 을 별도로 수행해야합니다 .

bodyParser는 더 이상 사용되지 않는 것으로 표시되어 있으므로 json, urlencode 및 multipart parser를 사용하여 강력한 connect-multiparty와 같은 방법을 사용하는 것이 좋습니다. (멀티 파트 미들웨어도 더 이상 사용되지 않습니다).

또한 urlencode + json을 정의하면 양식 데이터가 구문 분석되지 않고 req.body가 정의되지 않습니다. 멀티 파트 요청을 처리하는 미들웨어를 정의해야합니다.

var urlencode = require('urlencode');
var json = require('json-middleware');
var multipart = require('connect-multiparty');
var multipartMiddleware = multipart();

app.use(json);
app.use(urlencode);
app.use('/url/that/accepts/form-data', multipartMiddleware);

나는이 정말 나쁜 기능 그 갱신 추측
모하마드 Faizan 칸

본문 구문 분석을 위해 많은 코드를 수행해야합니다. 해킹은 무엇인가
Mohammad Faizan 칸

1
이것을 작동 시키려면 require ( 'json-middleware')에 ".middleware ()"를 추가해야했습니다.
DustinB

8

Express 4.1 이상

대부분의 답변이 Express, bodyParser, connect에 사용됩니다. multipart는 더 이상 사용되지 않습니다. 포스트 멀티 파트 개체를 쉽게 보낼 수있는 안전한 방법이 있습니다.

Multer는 connect.multipart ()를 대체 할 수 있습니다.

패키지를 설치하려면

$ npm install multer

앱에로드하십시오.

var multer = require('multer');

그런 다음 다른 양식 구문 분석 미들웨어와 함께 미들웨어 스택에 추가하십시오.

app.use(express.json());
app.use(express.urlencoded());
app.use(multer({ dest: './uploads/' }));

connect.json () 은 application / json을 처리합니다.

connect.urlencoded () 는 application / x-www-form-urlencoded를 처리합니다

multer () 는 multipart / form-data를 처리합니다.


8

나는이 정확한 문제를 찾고있었습니다. 위의 모든 조언을 따르고 있었지만 req.body는 여전히 빈 객체 {}를 반환했습니다. 제 경우에는 html이 정확하지 않은 것처럼 간단했습니다.

양식의 HTML에서뿐만 'name'아니라 입력 태그 의 속성 을 사용해야합니다 'id'. 그렇지 않으면 아무것도 파싱되지 않습니다.

<input id='foo' type='text' value='1'/>             // req = {}
<input id='foo' type='text' name='foo' value='1' /> // req = {foo:1}

내 바보 실수는 당신의 이익입니다.


여기에도 같은 문제가 있습니다. 그러나 처음부터 이름 속성을 사용하고있었습니다. 문제가 무엇인지 봅시다.
Saif Al Falah

6

app.use (express.bodyParser ())를 사용하지 않아야 합니다. BodyParser는 json + urlencoded + mulitpart의 조합입니다. connect 3.0에서 multipart가 제거되므로 이것을 사용하지 않아야합니다.

이를 해결하려면 다음을 수행하십시오.

app.use(express.json());
app.use(express.urlencoded());

app.use (app.router) 는 json 뒤에 사용하고 urlencoded를 사용해야한다는 것을 아는 것이 매우 중요 합니다. 그렇지 않으면 작동하지 않습니다!


4

요청 스트리밍이 나를 위해 일했습니다.

req.on('end', function() {
    var paramstring = postdata.split("&");
});

var postdata = "";
req.on('data', function(postdataChunk){
    postdata += postdataChunk;
});

1
하는 것보다 더 나은는 postdata.split("&")핵심 모듈을로드하는 것입니다 querystring = require('querystring')다음 구문 분석 postdataquerystring.parse(postdata);
John Slegers

4

POSTGET 요청 모두에 다음 코드를 사용하여 모든 매개 변수를 찾을 수 있습니다.

var express = require('express');
var app = express();
const util = require('util');
app.post('/', function (req, res) {
    console.log("Got a POST request for the homepage");
    res.send(util.inspect(req.query,false,null));
})

Express 버전으로 답변을 업데이트 하시겠습니까?
lfender6445

3

Express 버전 4.16으로 작성

라우터 기능 내에서 req.body속성을 사용하여 사후 변수에 액세스 할 수 있습니다 . 예를 들어, 이것이 POST양식 의 경로 인 경우 입력 한 내용을 다시 보냅니다.

function(req,res){
      res.send(req.body);

      //req.body.email would correspond with the HTML <input name="email"/>
}

PHP에 익숙한 사람들을위한 PS : PHP $_GET변수 에 액세스하기 위해 Node.js에서 사용하는 req.queryPHP $_POST변수 에 액세스합니다 req.body.


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

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

app.get('/',function(req,res){
  res.sendfile("index.html");
});
app.post('/login',function(req,res){
  var user_name=req.body.user;
  var password=req.body.password;
  console.log("User name = "+user_name+", password is "+password);
  res.end("yes");
});
app.listen(3000,function(){
  console.log("Started on PORT 3000");
})

1

포스트 파라미터는 다음과 같이 검색 할 수 있습니다.

app.post('/api/v1/test',Testfunction);
http.createServer(app).listen(port, function(){
    console.log("Express server listening on port " + port)
});

function Testfunction(request,response,next) {
   console.log(request.param("val1"));
   response.send('HI');
}

1
이것이 작동하지 않는다는 것을 알고 있습니까? paramGET 요청에 사용됩니다. POST가 아니며 예제에 세부 정보가 부족하여 새로운 사용자에게 혼란을 줄 수 있습니다. 그리고 그 위에 request.param실제로는 더 이상 사용되지 않으므로 많은 수준에서 예제가 잘못되었습니다.
vdegenne

0

당신이 사용하는 req.query.post잘못된 방법으로 req.query.post와 작품 method=get, method=post함께 작동 몸 파서 .

그냥 변경하여이 시도 게시물을 :

<form id="loginformA" action="userlogin" method="get">
<div>
    <label for="email">Email: </label>
    <input type="text" id="email" name="email"></input>
</div>
<input type="submit" value="Submit"></input>  
</form>

그리고 표현 코드에서 'app.get'을 사용하십시오.


0

빠른 파일 업로드 패키지를 사용하십시오 .

var app = require('express')();
var http = require('http').Server(app);
const fileUpload = require('express-fileupload')

app.use(fileUpload());

app.post('/', function(req, res) {
  var email = req.body.email;
  res.send('<h1>Email :</h1> '+email);
});

http.listen(3000, function(){
  console.log('Running Port:3000');
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.