提问人:Jem 提问时间:10/14/2014 最后编辑:Zeeshan Hassan MemonJem 更新时间:4/28/2023 访问量:131139
Node.js(使用express和bodyParser):无法从post请求中获取表单数据
Node.js (with express & bodyParser): unable to obtain form-data from post request
问:
我似乎无法恢复发送到我的 Node.js 服务器的发布请求的表单数据。我在下面放了服务器代码和发布请求(在 chrome 中使用邮递员发送):
发布请求
POST /api/login HTTP/1.1
Host: localhost:8080
Cache-Control: no-cache
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="userName"
jem
----WebKitFormBoundaryE19zNvXGzXaLvS5C
NodeJS 服务器代码
var express = require('express'); // call express
var app = express(); // define our app using express
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(bodyParser());
app.all('/*', function(req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Content-Type,accept,access_token,X-Requested-With');
next();
});
var port = process.env.PORT || 8080; // set our port
var router = express.Router(); // get an instance of the express Router
router.get('/', function(req, res) {
res.json({ message: 'I am groot!' });
});
// Login
router.route('/login')
.post(function(req, res){
console.log('Auth request recieved');
// Get the user name
var user = req.body.userName;
var aToken = getToken(user);
res.json({
'token':'a_token'
});
});
app.use('/api', router);
app.listen(port);
login 方法尝试获取 ,但是,始终为空。
我在 SO 上看到过其他描述这种行为的案例,但相关答案都不适用于这里。req.body.userName
req.body
谢谢你的帮助。
答:
通常,快速应用需要指定适当的正文解析器中间件才能包含正文。req.body
[已编辑]
如果您需要解析URL编码的(非多部分)表单数据以及JSON,请尝试添加:
// Put this statement near the top of your module var bodyParser = require('body-parser'); // Put these statements before you define any routes. app.use(bodyParser.urlencoded()); app.use(bodyParser.json());
首先,您需要将 body-parser 添加到 的属性中,然后执行 .
dependencies
package.json
npm update
要处理多部分表单数据,正文解析器将不起作用。请参阅此处建议的模块,以解析多部分主体。
bodyParser.urlencoded()
评论
body-parser
multipart
要处理支持文件上传的 multipart/form-data 请求,您需要使用 multer 模块。multer 中间件的 npm 链接
评论
确保按以下顺序输入:
bodyParser.json() 首先。
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
评论
我遵循了这个 https://www.tutorialspoint.com/expressjs/expressjs_form_data.htm
var bodyParser = require('body-parser');
var multer = require('multer');
var forms = multer();
// apply them
app.use(bodyParser.json());
app.use(forms.array());
app.use(bodyParser.urlencoded({ extended: true }));
// how to use
router.post('/', function(req, res) {
console.log(req.body);
console.log('received the widget request');
});
评论
console.log(req.body)
{}
确保你没有将 enctype 唱成 multipart/form-data,body 解析器不支持它。 在定义任何路由之前,请使用以下行。
app.use(bodyParser.urlencoded()); app.use(bodyParser.json());
- 对于 Json:使用 .
body-parser
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: true}))
(您还应该发送:在请求标头中)Content-Type
application/json
- 对于普通表单或多部分表单(包含文件的表单),请使用 + 。
body-parser
multer
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: true}))
app.use(multer().array())
(在这种情况下,您不应该发送。您不应该发送任何内容,或者如果您有表单中的文件。Content-Type: application/json
Content-Type: multipart/form-data
- 在 Postman 中,您不应手动发送。否则,您将收到错误 ()。(它会自动添加它。
Content-Type: multipart/form-data
Boundary not found
我发现,在我的情况下,我没有将“name”属性与 HTML 输入标签一起使用。我通过更改来修复它:
这
<input id="first_name" />
自
<input id="first_name" name="first_name" />
评论
多部分
消息,并且模块不支持解析该格式的数据。自述文件中的第 2 段提供了您可以使用的其他模块的建议。body-parser
x-www-form-urlencoded
发送。这是解析的格式。POST
multipart
bodyParser.urlencoded()