Node.js连接中间件限制不起作用

时间:2013-11-17 02:11:18

标签: javascript node.js

我有问题 服务器:

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框架我可以使用什么来限制请求的大小?

2 个答案:

答案 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