30

我正在使用 Node.js 和 express。

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

这与我的第二个问题有关。我正在使用 express 从req.files. /tmp一旦文件大小超过某个文件大小,有没有办法停止将文件写入文件夹(这是默认上传行为)?

4

7 回答 7

33

只是更新(07-2014),因为我无法添加评论:

如上所述,较新的 Express 版本已弃用limit中间件,现在将其作为中间件的内置选项提供BodyParser

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

   var app = express()
   app.use(bodyParser.json({ limit: '5mb' }))
于 2014-07-22T17:31:00.363 回答
13

Express 使用 Connect,它有一个可用的限制中间件。您可以通过执行以下操作在您的 Express 应用程序中使用它:

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

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


注意:此中间件已弃用,很快将被删除。有关为什么会这样的讨论,请访问:https ://github.com/senchalabs/connect/pull/925#issuecomment-26990726

于 2012-01-29T09:53:52.760 回答
13

节点github源码:

/* 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(),您必须要求 body-parser 模块并使用它的 json() 和 urlencoded() 方法,如果没有为 bodyParser.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}));
于 2017-03-29T12:19:59.023 回答
4

对于未弃用的更新解决方案,您可以像这样在 app.js 文件中添加限制:

app.use(express.json({limit: '2mb'}));
app.use(express.urlencoded({limit: '2mb', extended: false}));

你也可以这样做:

app.use(express.json({limit: 2000000}));
app.use(express.urlencoded({limit: 2000000, extended: false}));
于 2019-04-22T07:15:10.177 回答
1
var methodOverride = require('method-override');
app.use(bodyParser.urlencoded({
        extended: true, limit: '50mb'
    }));
app.use(bodyParser.json({limit: '50mb'}));
app.use(methodOverride());
于 2019-08-22T03:11:36.030 回答
0

问题 1 的答案

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

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

bodyParser.urlencoded

来自前端的文件以 urlencoded 的形式出现。

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

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

bodyParser.json

返回仅解析 json 的中间件。此解析器接受正文的任何​​ Unicode 编码,并支持 gzip 和 deflate 编码的自动膨胀。

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

注意:默认情况下,正文解析器的输入限制为100kb

问题 2 的答案

要更改默认上传目录,我们可以使用以下内容。

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

希望这可以帮助!

于 2017-03-29T07:46:59.367 回答
0

使用raw-body. 大多数中间件(如 limit)不再与 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

Express 不再允许您使用传统的捆绑中间件显式设置限制,如下所示。

app.use(express.limit('4M'));
于 2016-12-19T23:32:14.757 回答