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

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

<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로 변경하면 작동하므로 .. 어떤 아이디어?



답변

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


답변

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

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


답변

참고 :이 답변은 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 사용자에게 더 자연스러운 답변을 수정했습니다.


답변

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

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

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


답변

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();
})


답변

주어진 형태 :

<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


답변

백엔드 :

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
});