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

Node.js Connect middleware Limit not working

本文关键字:不起作用 中间件 js 连接 Node      更新时间:2023-09-26

我有问题服务器:

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

改为执行以下操作:

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

限制中间件只检查请求消息的头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