Nodejs expressjs获取request的body问题。用了bodyParser后,post没有生效
Nodejs expressjs获取request的body问题。用了bodyParser后,post没有生效
var express = require(‘express’);
var app = express();
app.listen(30001);
app.use(function(req, res, next) {
req.rawBody = ‘’;
req.setEncoding(‘utf8’);
req.on(‘data’, function(chunk) {
req.rawBody += chunk;
});
req.on(‘end’, function() {
next();
});
});
app.use(express.bodyParser());
app.post("/ajax",function(req,res)
{
res.send(“post”);
}
);
post的时候,设置Content-Type为application/x-www-form-urlencoded 就不会有响应,如果设置其它的content-type就没有问题
我稍微看了一下express源码,貌似问题出在下面这个文件里面 \node_modules\express\node_modules\connect\lib\middleware\urlencoded.js 这个文件里面的
limit(req, res, function(err){
if (err) return next(err);
var buf = ‘’;
console.log(‘urlencoded’);//这句话会执行
req.setEncoding(‘utf8’);
req.on(‘data’, function(chunk){ buf += chunk;});
req.on(‘end’, function(){
try {
req.body = buf.length
? qs.parse(buf, options)
: {};
} catch (err){
err.body = buf;
console.log(err);
return next(err);
}
next();
});
});
data和end事件都没有执行,所有next()就没有继续下去了,求解。
Nodejs expressjs获取request的body问题。用了bodyParser后,post没有生效
在使用Express处理POST请求时,有时可能会遇到bodyParser
不起作用的情况,特别是当Content-Type
设置为application/x-www-form-urlencoded
时。下面是一些可能的原因及解决方案。
问题描述
当你在使用bodyParser
中间件处理POST请求时,如果Content-Type
设置为application/x-www-form-urlencoded
,可能会发现请求没有被正确解析,导致没有响应。
示例代码
var express = require('express');
var bodyParser = require('body-parser'); // 引入body-parser中间件
var app = express();
// 使用bodyParser中间件来解析请求体
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.post('/ajax', function(req, res) {
console.log(req.body); // 打印请求体
res.send('Post received');
});
app.listen(30001, function() {
console.log('Server is running on port 30001');
});
解释
-
引入body-parser:
var bodyParser = require('body-parser');
这一步是为了引入
body-parser
中间件,它可以帮助我们解析请求体。 -
使用bodyParser中间件:
app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json());
这里使用了两个中间件:
bodyParser.urlencoded({ extended: true })
用于解析application/x-www-form-urlencoded
类型的数据。bodyParser.json()
用于解析application/json
类型的数据。
-
处理POST请求:
app.post('/ajax', function(req, res) { console.log(req.body); // 打印请求体 res.send('Post received'); });
在这里,我们定义了一个POST路由
/ajax
,并打印请求体req.body
以验证是否成功解析。
常见问题
- 如果你仍然遇到问题,请确保你的
Content-Type
头设置正确,并且数据格式也符合预期。 - 确保在使用
bodyParser
之前已经正确引入并使用了它。 - 如果你使用的是较旧版本的Express,可能需要升级到最新版本,因为
bodyParser
已经被内置到Express中。
通过以上步骤,你应该能够解决使用bodyParser
时遇到的问题,并正确处理POST请求。
因为你在app.use(express.bodyParser());之前自己处理定义了一个app.use(function(req, res, next) 处理器,<pre>req.on(‘end’, function() { next(); });</pre>只有请求数据接收完成才会进入bodyParser处理器,但是bodyParser此时已经接收不到数据了,所有程序会永远停在这个地方.拿掉你自己定义的那个处理器,或者在req.on(‘data’, function(chunk) {里面也调用一下next()也可以.
但是我不能拿掉那个啊,我现在的目的就是要取到request的原始body
哦,错了在app.use(function(req, res, next) 最后加个next()应该可行
再end里面不需要next()了
根据你的描述,问题可能是由于旧版 bodyParser
中间件的使用方式不正确导致的。bodyParser
已经被废弃,你可以使用 express
自带的中间件 express.json()
和 express.urlencoded()
来处理请求体。
以下是修改后的代码示例:
const express = require('express');
const app = express();
// 使用新的中间件
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.post("/ajax", function(req, res) {
console.log(req.body); // 输出请求体
res.send("post");
});
app.listen(30001, () => {
console.log('Server is running on port 30001');
});
解释:
- 中间件顺序:确保在路由之前应用中间件。
- 使用新版中间件:
express.json()
用于解析 JSON 格式的请求体,express.urlencoded()
用于解析application/x-www-form-urlencoded
格式的请求体。 - 调试信息:通过打印
req.body
可以验证是否成功解析了请求体。
这样可以解决你遇到的问题,并且代码更简洁、更易维护。