expressjs获取request的body问题。用了bodyParser后,post没有生效
发布于 1年前 作者 vfan2010 1797 次浏览
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()就没有继续下去了,求解。

6 回复

因为你在app.use(express.bodyParser());之前自己处理定义了一个app.use(function(req, res, next) 处理器,

req.on('end’, function() {
next();
});
只有请求数据接收完成才会进入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()了

回到顶部