2012-01-29 292 views
9

我使用Node.js并表达。Node.js:如何限制HTTP请求大小和上传文件大小?

我想限制HTTP请求的大小。比方说,如果有人向我发送超过2 MB的HTTP请求,我立即停止请求。我看了代码,我想如果我改变核心,我可以做到。但是,有没有办法设置一个max_request_size或类似的东西呢?

这与我的第二个问题有关。我使用快递从req.files获取上传的文件。只要文件大小超过特定文件大小,是否有办法停止将文件写入/tmp文件夹(这是默认的上载行为)?

回答

9

Express使用连接,其中有a limit middleware available。你可以做这样的事情在您的快速应用程序中使用这样的:

app.use(express.limit('2mb')); 

,例如,将限制所有HTTP请求到2 MB。由于上传的文件是HTTP请求的一部分,因此任何大于2 MB的文件上传也会被中止。


注:该中间件已被弃用,将很快被删除。论为什么是这样的情况,请访问:https://github.com/senchalabs/connect/pull/925#issuecomment-26990726

+0

如果我限制为2MB,并发送1GB的http请求。如果超过2MB,它会立即停止吗?或返回错误,但仍然获得0.998GB数据的其余部分? – murvinlai 2012-01-30 21:21:41

+5

该源代码位于https://github.com/senchalabs/connect/blob/master/lib/middleware/limit.js。如果我正确读取它,它会读取分块数据并在超过大小限制时立即终止请求。 – 2012-02-01 12:37:23

+0

表示。限制在nodejs 6上被弃用为中间件 – user1709076 2016-05-06 19:40:05

14

只是一个更新(07-2014),因为我不能够添加注释:

以上作为正确地指出,新的快递版本弃用了使用limit中间件,现在提供了它作为一个built-in optionBodyParser中间件:

var express = require('express') 
    var bodyParser = require('body-parser') 

    var app = express() 
    app.use(bodyParser.json({ limit: '5mb' })) 
+0

这就是我需要的。谢谢。 – emj365 2014-10-24 14:35:06

+0

在节点6上对我不起作用 – user1709076 2016-05-06 19:39:31

+0

如何在请求模块的情况下增加限制 – 981 2017-02-16 08:44:12

0

使用raw-body。大多数中间件(如限制)不再与Express捆绑在一起,必须单独安装。这是一个例子。

var getRawBody = require('raw-body') 
app.use(function (req, res, next) { 
     getRawBody(
     stream = req, 
     options = { 
      length: req.headers['content-length'], 
      limit: '100mb', 
     }, 
     callback = function (err, reslt) { 
      if (err) { 
      return next(err) 
      } 
      next(); 
      console.log(req) 
     }) 
    }) 
  • 记住后app.use

快递不再允许您使用传统的捆绑中间件,如下所示明确将限制设置为添加路由器。

0

回答问题1

要限制HTTP请求的大小和上传文件的大小,我们需要设置body-parser限制。

app.use(bodyParser.urlencoded({limit: '50mb',extended: true})); 
app.use(bodyParser.json({limit: '50mb'})); 

bodyParser.urlencoded

从前端的文件来作为url编码机构。

返回仅分析urlencoded主体的中间件。此解析器只接受身体的UTF-8编码,并支持gzip和deflate编码的自动膨胀。

在中间件(即req.body)之后,包含分析数据的新主体对象被填充在请求对象上。该对象将包含键值对,其中值可以是字符串或数组(当扩展为false时)或任何类型(当扩展为true时)。

bodyParser.json

返回中间件,只有解析JSON。该解析器接受身体的任何Unicode编码,并支持gzip和deflate编码的自动膨胀。

在中间件(即req.body)之后,包含分析数据的新主体对象被填充在请求对象上。

注意: 默认情况下,身体解析器的输入限制是问题2100kb

答:

要改变,我们可以使用下面的默认上传目录。

app.set('uploadDir', './files'); // Sets the upload Directory to files folder in your project. 

其他执行

虽然包括bodyParser到应用程序,我们可以提到的上传目录。

app.use(express.bodyParser({uploadDir:'./files', keepExtensions: true})); 

参考

问题https://github.com/expressjs/express/issues/1684

希望这有助于!节点github上的

+0

问题#1(和我在赏金中的重点)是关于* request *的大小,但你的答案是关于* request body *的大小。您提供的参考链接:“控制最大的请求主体大小” – 2017-03-30 21:09:02

5

的源代码:

/* Maximium header size allowed. If the macro is not defined 
* before including this header then the default is used. To 
* change the maximum header size, define the macro in the build 
* environment (e.g. -DHTTP_MAX_HEADER_SIZE=<value>). To remove 
* the effective limit on the size of the header, define the macro 
* to a very large number (e.g. -DHTTP_MAX_HEADER_SIZE=0x7fffffff) 
*/ 
#ifndef HTTP_MAX_HEADER_SIZE 
# define HTTP_MAX_HEADER_SIZE (80*1024) 
#endif 

所以,你需要从源代码重建节点超过80 * 1024的限制

您可以使用此与Express 4的限制请求主体大小/上传文件大小而不是express.json()和express.urlencoded(),如果扩展选项没有为bodyParser明确定义,则必须要求body-parser模块并使用它的json()和urlencoded()方法。 urlencoded()会引发警告(body-parser deprecated undefined extended:提供扩展选项)。

var bodyParser = require('body-parser'); 
app.use(bodyParser.json({limit: '50mb'})); 
app.use(bodyParser.urlencoded({limit: '50mb', extended: true})); 
+0

问题#1(以及我在赏金中的重点)是关于请求大小的,但是您的答案是关于请求主体大小的,它在bodyParser中明确提到docs that limit参数“控制最大请求体大小” – 2017-03-30 21:10:48

+0

节点github的源代码:/ *允许使用Maximium头大小如果在包含此头之前没有定义宏 *则使用默认值 *更改最大标题大小,在构建的环境中定义宏(例如-DHTTP_MAX_HEADER_SIZE = )。删除 *对标题大小的有效限制,将宏 *定义为非常大的数字(例如, -DHTTP_MAX_HEADER_SIZE = 0x7FFFFFFF的) */ 的#ifndef HTTP_MAX_HEADER_SIZE #定义HTTP_MAX_HEADER_SIZE(80 * 1024) #ENDIF ......所以,你需要从源节点重建超过80 * 1024的限制 – AJS 2017-03-31 05:38:51