如果请求太大,如何在Express中制作中间件将返回413?

时间:2013-12-23 03:16:35

标签: javascript node.js express

我在这里的内容似乎没有回复任何内容。奇怪的是调试记录器显示POST /ServiceName 413 2ms

var maxSize = 1000*1000;

module.exports = function (req, res, next) {
  var size = req.headers['content-length'];
  if(size>maxSize){
    var errorMessage = "Request of size "+size+" rejected";
    res.status(413);
    res.send({error:"Please do not send that it makes my server sad"});
    console.error(errorMessage);
  }
  else{
    next();
  }
}

如果这有助于任何人,那么摩卡测试就会消失。

  it('should 413 when the request is over a meg', function(done){
    var x = "1234567890";
    var iterations = 14;
    for (var i = 0; i < iterations; i++) {
      x += x+x;
    }
    superagent.post('http://localhost:3000/CartItemAdd')
      .send({ 
        name: x,
        item: '12354'
      })
      .end(function(e,res){
        expect(e).to.eql(null);
        expect(res.status).to.eql(413);
        expect(res.body).to.be.an('object');
        done(e)
      })    
  });

2 个答案:

答案 0 :(得分:1)

express.limit中间件会为你发送一个413:

app.use(connect.limit('1mb'));

您可以在此处学习源代码:http://www.senchalabs.org/connect/limit.html

如果你想使用中间件来限制身体,不推荐使用express.limit,你可以切换到raw-body

$npm install raw-body

var getRawBody = require('raw-body')

app.use(function (req, res, next) {
  getRawBody(req, {
    length: req.headers['content-length'],
    limit: '1mb',
    encoding: 'utf8'
  }, function (err, string) {
    if (err)
      return next(err)

    req.text = string
    next()
  })
})

自述文件:https://github.com/stream-utils/raw-body

答案 1 :(得分:0)

看起来它可能只是你如何获得Content-Length标题。

request有一个get method,用于不区分大小写的标题。

我猜req.get('content-length')req.headers['Content-Length']可能会做到这一点。

此外,size > maxSize可能会将字符串与数字进行比较,除非将Content-Length标头转换为某个数字。这应该没关系,因为类型强制会在这里生效,但值得注意。