这是我的简单表格:
<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 调用时,它可以工作,所以..有什么想法吗?
bodyParser()
的每个人也应该阅读 @SeanLynch 's answer below
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 中一样:
首先你需要添加一些中间件来解析body的post数据。
添加以下一行或两行代码:
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。
使用 express.bodyParser() 的安全问题
虽然目前所有其他答案都建议使用 express.bodyParser()
中间件,但这实际上是 express.json()
、express.urlencoded()
和 express.multipart()
中间件 (http://expressjs.com/api.html#bodyParser) 的包装。表单请求正文的解析由 express.urlencoded()
中间件完成,您只需在 req.body
对象上公开表单数据即可。
由于 security concern 与 express.multipart()
/connect.multipart()
如何为所有上传的文件创建临时文件(并且不会被垃圾收集),现在 recommended 不使用 express.bodyParser()
包装器,而是仅使用您需要的中间件。
注意:当 Connect 3.0(Express 扩展)发布时,connect.bodyParser()
将很快更新为仅包含 urlencoded
和 json
。
所以简而言之,而不是......
app.use(express.bodyParser());
...你应该使用
app.use(express.urlencoded());
app.use(express.json()); // if needed
如果/当您需要处理多部分表单(文件上传)时,请使用第三方库或中间件,例如 multiparty、busboy、dicer 等。
multipart()
作为 bodyParser()
的一部分,bodyParser()
将再次变得“安全”,但您需要使用第三方库显式启用多部分支持。
注意:此答案适用于 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 用户更自然。
如果您想在没有中间件的情况下构建发布的查询,这将做到这一点:
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。
您必须单独安装软件包 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();
})
给定某种形式:
<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
});
app.use(express.bodyParser());
然后对于 app.post
请求,您可以通过 req.body.{post request variable}
获取帖子值。
Express 4.4.1 更新
以下中间件已从 Express 中删除。
身体解析器
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 解析器的方式,如强大的、连接多方。 (多部分中间件也已弃用)。
还要记住,只是定义了 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);
我正在寻找这个确切的问题。我遵循了上面的所有建议,但 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}
我的白痴错误是你的好处。
更新
从 Express version 4.16+
开始,他们自己的 body-parser 实现现在包含在默认的 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 中的文档)。
对于 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() 处理应用程序/json
connect.urlencoded() 处理 application/x-www-form-urlencoded
multer() 处理多部分/表单数据
你不应该使用 app.use(express.bodyParser())。 BodyParser 是 json + urlencoded + mulitpart 的结合。你不应该使用它,因为 multipart 将在 connect 3.0 中被删除。
要解决这个问题,您可以这样做:
app.use(express.json());
app.use(express.urlencoded());
重要的是要知道 app.use(app.router) 应该在 json 和 urlencoded 之后使用,否则它不起作用!
快递 v4.17.0
app.use(express.urlencoded( {extended: true} ))
app.post('/userlogin', (req, res) => {
console.log(req.body) // object
var email = req.body.email;
}
请求流式传输对我有用
req.on('end', function() {
var paramstring = postdata.split("&");
});
var postdata = "";
req.on('data', function(postdataChunk){
postdata += postdataChunk;
});
postdata.split("&")
更好的是加载核心模块 querystring = require('querystring')
,然后使用 querystring.parse(postdata)
解析您的 postdata
;
写于 Express 版本 4.16
在 router 函数中,您可以使用 req.body
属性来访问 post 变量。例如,如果这是表单的 POST
路由,它会发回您输入的内容:
function(req,res){
res.send(req.body);
//req.body.email would correspond with the HTML <input name="email"/>
}
对熟悉 PHP 的人的 PS:为了访问 PHP 的 $_GET
变量,我们使用 req.query
并访问 PHP 的 $_POST
变量,我们在 Node.js 中使用 req.body
。
我可以通过对 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));
})
从 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)
})
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 参数:
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');
}
param
用于 GET 请求.. 不是 POST 并且您的示例缺少详细信息,对于新手来说非常混乱。最重要的是 request.param
实际上已被弃用,因此您的示例在很多层面上都是错误的。
使用 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');
});
app.use(express.urlencoded({ extended: true }))
在我的情况下不起作用,因此我无法获取正文数据。谢谢!
您在使用 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'
POST
而不是 GET
的原因有很多 - 安全性和数据大小都在前面 - 所以这不是一个合适的方法。
当您在 HTML 表单中使用 POST 方法时,您需要从服务器端(即 Node.js)的 req.body 中捕获数据。并添加
var bodyParser = require('body-parser')
app.use( bodyParser.json() );
app.use(bodyParser.urlencoded({extended: false}));
或者
在 HTML 中使用 method='GET' 并通过服务器端的 req.query 捕获数据,即 Node.js
content-type
标头,例如:curl -d '{"good_food":["pizza"]}' -H 'content-type:application/json' "http://www.example.com/your_endpoint"
bodyParser
将 JSON、URL 编码和多部分数据抽象到req.body
对象中。app.use(require('body-parser').json())
行就足够了。然后,您可以从路由定义中的请求主体对象(即req.body
)读取 json 数据。