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()就没有继续下去了,求解。
因为你在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
@vfan2010在req.on(‘data’, function(chunk) {里面也调用一下next()也可以.
@dengqiao 这样肯定不行的。。
哦,错了在app.use(function(req, res, next) 最后加个next()应该可行
再end里面不需要next()了