我有问题 服务器:
var connect = require('connect');
var http = require('http');
var app = connect()
.use(connect.limit('32kb'))
.use(connect.urlencoded())
.use(connect.json())
.use(function(req, res){
console.log('yo');
res.end('hello\n');
});
http.createServer(app).listen(3000);
客户端:
var http = require('http');
var req = http.request({
method: 'POST',
port: 3000,
headers: {
'Content-Type': 'application/json'
}
});
req.write('[');
var n = 30000000;
while (n--) {
req.write('"foo",');
}
req.write('"bar"]');
req.end();
Connect的中间件限制不是"限制" json的大小。我知道它会被弃用,而是Express框架我可以使用什么来限制请求的大小?
答案 0 :(得分:1)
改为:
.use(connect.urlencoded({
limit: '32kb'
}))
.use(connect.json({
limit: '32kb'
}))
或只是:
.use(connect.bodyParser({
limit: '32kb'
})
您仍然可以写入req
,但这并不一定意味着服务器将接收这些字节。如果您检查响应并且它不是4xx错误,那么这是一个错误。
编辑:
req.once('response', function (res) {
assert.equal(res.statusCode, 413)
})
.write(new Buffer(123123123213223122))
.end()
答案 1 :(得分:0)
限制中间件检查请求消息仅的标头Content-Length
,而HTTP POST请求中没有此类标头。
您可以使用以下方式验证:
var app = connect()
.use(connect.limit('32kb'))
.use(connect.urlencoded())
.use(connect.json())
.use(function(req, res){
console.log(req.headers);
console.log('yo');
res.end('hello\n');
});
您可以通过以下代码测试limit
中间位置:
var http = require('http');
var req = http.request({
method: 'POST',
port: 3000,
headers: {
'Content-Type': 'application/json',
'Content-Length': 40 * 1024
}
});
BTW:您可以查看limit
中间件的测试方式:https://github.com/senchalabs/connect/blob/master/test/limit.js