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 호출로 변경하면 작동하므로 .. 어떤 생각이 있습니까?
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()
곧만을 포함하도록 업데이트됩니다 urlencoded
및 json
연결 3.0 (Express가 확장되는) 해제 될 때.
간단히 말해서 대신 ...
app.use(express.bodyParser());
... 당신은 사용해야합니다
app.use(express.urlencoded());
app.use(express.json()); // if needed
멀티 파트 양식 (파일 업로드)을 처리해야하는 경우 / 때 multiparty, busboy, dicer 등과 같은 타사 라이브러리 또는 미들웨어를 사용합니다.
참고 :이 답변은 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
)를 사용하여 구문 분석됩니다 . 를 사용하여 반복되는 매개 변수를 구문 분석 하려면 매개 변수에 대괄호가 있어야 합니다.. 중첩 된 맵도 지원합니다. HTML 양식 제출을 구문 분석하는 것 외에도 bodyParser는 JSON 요청을 자동으로 구문 분석 할 수 있습니다.querystring
qs
name[]=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를 참조 하십시오 .
npm 과 body-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
app.use(express.bodyParser());
그런 다음 app.post
요청을 위해을 통해 게시물 값을 얻을 수 있습니다 req.body.{post request variable}
.
Express 4.4.1 용 업데이트
Middleware of the following is removed from Express.
- bodyParser
- json
- urlencoded
- multipart
When you use the middleware directly like you did in express 3.0. You will get the following error:
Error: Most middleware (like urlencoded) is no longer bundled with Express and
must be installed separately.
In order to utilize those middleware, now you need to do npm for each middleware separately.
Since bodyParser is marked as deprecated, so I recommend the following way using json, urlencode and multipart parser like formidable, connect-multiparty. (Multipart middleware is deprecated as well).
Also remember, just defining urlencode + json, the form data will not be parsed and req.body will be undefined. You need to define a middleware handle the multipart request.
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);
Backend:
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);
});
Frontend:
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
});
For Express 4.1 and above
As most of the answers are using to Express, bodyParser, connect; where multipart is deprecated. There is a secure way to send post multipart objects easily.
Multer can be used as replacement for connect.multipart().
To install the package
$ npm install multer
Load it in your app:
var multer = require('multer');
And then, add it in the middleware stack along with the other form parsing middleware.
app.use(express.json());
app.use(express.urlencoded());
app.use(multer({ dest: './uploads/' }));
connect.json() handles application/json
connect.urlencoded() handles application/x-www-form-urlencoded
multer() handles multipart/form-data
I was searching for this exact problem. I was following all the advice above but req.body was still returning an empty object {}. In my case, it was something just as simple as the html being incorrect.
In your form's html, make sure you use the 'name'
attribute in your input tags, not just 'id'
. Otherwise, nothing is parsed.
<input id='foo' type='text' value='1'/> // req = {}
<input id='foo' type='text' name='foo' value='1' /> // req = {foo:1}
My idiot mistake is your benefit.
You shoudn't use app.use(express.bodyParser()). BodyParser is a union of json + urlencoded + mulitpart. You shoudn't use this because multipart will be removed in connect 3.0.
To resolve that, you can do this:
app.use(express.json());
app.use(express.urlencoded());
It´s very important know that app.use(app.router) should be used after the json and urlencoded, otherwise it does not work!
Request streaming worked for me
req.on('end', function() {
var paramstring = postdata.split("&");
});
var postdata = "";
req.on('data', function(postdataChunk){
postdata += postdataChunk;
});
I could find all parameters by using following code for both POST and GET requests.
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));
})
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");
})
Post Parameters can be retrieved as follows:
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');
}
You are using req.query.post
with wrong method req.query.post
works with method=get
, method=post
works with body-parser.
Just try this by changing post to get :
<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>
And in express code use 'app.get'
Use express-fileupload package:
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');
});
Written at Express version 4.16
Inside the router function you can use req.body
property to access the post variable. For example if this was the POST
route of your form, it would send back what you input:
function(req,res){
res.send(req.body);
//req.body.email would correspond with the HTML <input name="email"/>
}
P.S. for those who are familiar with PHP: In order to access PHP's $_GET
variable we use req.query
and to access PHP's $_POST
variable we use req.body
in Node.js.
참고URL : https://stackoverflow.com/questions/5710358/how-to-retrieve-post-query-parameters
'Program Tip' 카테고리의 다른 글
jQuery없이 AJAX 호출을 만드는 방법은 무엇입니까? (0) | 2020.09.29 |
---|---|
PHP 배열이 연관 또는 순차인지 확인하는 방법은 무엇입니까? (0) | 2020.09.29 |
JavaScript에서 여러 값을 반환 하시겠습니까? (0) | 2020.09.29 |
Eclipse에서 줄 번호를 어떻게 표시 할 수 있습니까? (0) | 2020.09.29 |
JavaScript의 HTTP GET 요청? (0) | 2020.09.29 |