Javascript 如果请求太大,如何在Express中生成返回413的中间件?

Javascript 如果请求太大,如何在Express中生成返回413的中间件?,javascript,node.js,express,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+" rejec

我在这里所做的似乎并没有对回应做出任何回应。奇怪的是调试记录器显示
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)
      })    
  });
it('当请求通过meg时应为413',功能(完成){
var x=“1234567890”;
var迭代次数=14次;
对于(var i=0;i
看起来这可能仅仅是您获取内容长度标题的方式

请求
有一个用于不敏感地拉出头的案例

我猜
req.get('content-length')
req.headers['content-length']
可能会起作用


此外,
size>maxSize
可能会将字符串与数字进行比较,除非express将内容长度标题转换为某个数字。这不重要,因为类型强制将在此处生效,但值得注意。

express.limit中间件将为您发送413:

app.use(connect.limit('1mb'));
您可以在此处学习源代码:

如果要使用限制正文的中间件,express.limit已被弃用,可以切换到
原始正文

$npm安装原始车身

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()
  })
})

自述文件:

最大大小正确,但您是对的,我应该注意这一点。我的实际问题是在使用主体解析中间件之前尝试响应。下面标记的答案是对我提出的主要问题的一个很好且详细的回答。