这是我的简单形式:
<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电话时,它有效,所以......任何想法?
答案 0 :(得分:1152)
事情已经changed再次启动 Express 4.16.0 ,您现在可以像 Express 3.0一样使用express.json()
和express.urlencoded()
强>
这是different从 Express 4.0到4.15 :
开始$ 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()
存在安全问题,因此最好明确添加对所需特定编码类型的支持。如果您确实需要多部分编码(例如,支持上传文件),那么您应该read this。
答案 1 :(得分:81)
使用express.bodyParser()
的安全问题虽然目前所有其他答案都建议使用express.bodyParser()
中间件,但这实际上是express.json()
,express.urlencoded()
和express.multipart()
中间件({{3} })。表单请求主体的解析由express.urlencoded()
中间件完成,是您在req.body
对象上公开表单数据所需的全部内容。
由于http://expressjs.com/api.html#bodyParser express.multipart()
/ connect.multipart()
如何为所有上传的文件创建临时文件(并且不是垃圾回收),现在 security concern 不要使用express.bodyParser()
包装器,而只使用您需要的中间件。
注意:{Connect}扩展后,connect.bodyParser()
很快就会更新为仅包含urlencoded
和json
。
简而言之,而不是......
app.use(express.bodyParser());
......你应该使用
app.use(express.urlencoded());
app.use(express.json()); // if needed
如果/当您需要处理多部分表单(文件上传)时,请使用第三方库或中间件,如multiparty,busboy,dicer等。
答案 2 :(得分:80)
注意:此答案适用于Express 2.有关Express 3,请参阅here。
如果您使用的是connect / express,则应使用bodyParser middleware:Expressjs guide中对此进行了描述。
// 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-style parameter handling (qs
)而不是low-level querystring
library来解析查询字符串和正文。为了使用qs
解析重复参数,参数需要包含括号:name[]=val1&name[]=val2
。它还支持嵌套映射。除了解析HTML表单提交外,bodyParser还可以自动解析JSON请求。
编辑:我读了express.js并修改了我的答案,以便对Express用户更自然。
答案 3 :(得分:29)
如果你想在没有中间件的情况下构建发布的查询,这将会这样做:
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
尽管使用中间件可能更好,所以你不必在每条路线中反复写这个。
答案 4 :(得分:23)
Express 4用户注意事项:
如果您尝试将app.use(express.bodyParser());
放入应用程序,则在尝试启动Express服务器时会出现以下错误:
错误:大多数中间件(如bodyParser)不再与Express捆绑在一起,必须单独安装。请参阅https://github.com/senchalabs/connect#middleware。
您必须单独安装软件包body-parser
from npm,然后使用以下内容(示例来自the GitHub page):
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();
})
答案 5 :(得分:18)
给出某种形式:
<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 :(得分:14)
app.use(express.bodyParser());
然后,对于app.post
请求,您可以通过req.body.{post request variable}
获取帖子值。
答案 7 :(得分:14)
以下中间件已从Express中删除。
直接使用中间件,就像在Express 3.0中一样。您将收到以下错误:
Error: Most middleware (like urlencoded) is no longer bundled with Express and
must be installed separately.
为了利用这些中间件,现在需要分别为每个中间件执行 npm 。
由于bodyParser被标记为已弃用,因此我建议使用json,urlencode和multipart解析器(如formidable,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);
答案 8 :(得分:13)
后端:
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' }), // stringify JSON
headers: new Headers({ "Content-Type": "application/json" }); // add headers
});
答案 9 :(得分:7)
由于大多数答案都用于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
答案 10 :(得分:7)
我正在寻找这个确切的问题。我按照上面的所有建议,但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}
我的白痴错误是你的好处。
答案 11 :(得分:5)
你不应该使用 app.use(express.bodyParser())。 BodyParser是json + urlencoded + mulitpart的联合。你不应该使用它,因为multipart将在connect 3.0中删除。
要解决此问题,您可以执行以下操作:
app.use(express.json());
app.use(express.urlencoded());
非常重要的是知道应该在json和urlencoded之后使用 app.use(app.router),否则它不起作用!
答案 12 :(得分:4)
更新
自Express version 4.16+
起,默认的Express软件包中已包含他们自己的主体分析器实现,因此您无需下载其他依赖项。
您可能已经在代码中添加了一行,如下所示:
app.use(bodyparser.json()); //utilizes the body-parser package
如果您使用的是Express 4.16+,现在可以将该行替换为:
app.use(express.json()); //Used to parse JSON bodies
这不应给您的应用程序带来任何重大变化,因为express.json()中的代码基于bodyparser.json()。
如果您的环境中还包含以下代码:
app.use(bodyParser.urlencoded({extended: true}));
您可以将其替换为:
app.use(express.urlencoded()); //Parse URL-encoded bodies
最后的警告注意:在某些非常特殊的情况下,可能仍需要body-parser
,但是大多数情况下,您只需要Express
的body-parser实现用例。
(有关更多详细信息,请参见expressjs/bodyparser上的文档)。
答案 13 :(得分:2)
请求流媒体为我工作
req.on('end', function() {
var paramstring = postdata.split("&");
});
var postdata = "";
req.on('data', function(postdataChunk){
postdata += postdataChunk;
});
答案 14 :(得分:2)
我可以通过对 POST 和 GET 请求使用以下代码来查找所有参数。
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));
})
答案 15 :(得分:1)
B*H*W
答案 16 :(得分:1)
写于Express版本4.16
在路由器功能内,您可以使用req.body
属性来访问post变量。例如,如果这是表单的POST
路由,它将发送回您输入的内容:
function(req,res){
res.send(req.body);
//req.body.email would correspond with the HTML <input name="email"/>
}
P.S。对于那些熟悉PHP的人:为了访问PHP的$_GET
变量,我们使用req.query
,并访问PHP的$_POST
变量,我们在Node.js中使用req.body
。>
答案 17 :(得分:0)
使用express-fileupload包
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');
});
答案 18 :(得分:0)
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");
})
答案 19 :(得分:0)
你正在使用'req.query.post'和错误的方法'req.query.post'与'method = get'一起使用 'method = post'适用于body-parser。
只需通过更改帖子来获取
即可<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'
答案 20 :(得分:0)
Express v4.17.0
app.use(express.urlencoded( {extended: true} ))
app.post('/userlogin', (req, res) => {
console.log(req.body) // object
var email = req.body.email;
}
答案 21 :(得分:-1)
在HTML表单中使用POST方法时,您需要从服务器端req.body中捕获数据,即Node.js。 并添加
var bodyParser = require('body-parser')
app.use( bodyParser.json() );
app.use(bodyParser.urlencoded({extended: false}));
OR
在HTML中使用method ='GET'并通过服务器端req.query捕获数据,即Node.js
答案 22 :(得分:-1)
来自official文档第4版
const express = require('express')
const app = express()
app.use(express.json());
app.use(express.urlencoded({ extended: true }))
app.post('/push/send', (request, response) => {
console.log(request.body)
})