我在这里的内容似乎没有回复任何内容。奇怪的是调试记录器显示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)
})
});
答案 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()
})
})
答案 1 :(得分:0)
看起来它可能只是你如何获得Content-Length标题。
request
有一个get
method,用于不区分大小写的标题。
我猜req.get('content-length')
或req.headers['Content-Length']
可能会做到这一点。
此外,size > maxSize
可能会将字符串与数字进行比较,除非将Content-Length标头转换为某个数字。这应该没关系,因为类型强制会在这里生效,但值得注意。