我收到以下错误与快递:

Error: request entity too large
    at module.exports (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/node_modules/raw-body/index.js:16:15)
    at json (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/middleware/json.js:60:5)
    at Object.bodyParser [as handle] (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js:53:5)
    at next (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/proto.js:193:15)
    at Object.cookieParser [as handle] (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/middleware/cookieParser.js:60:5)
    at next (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/proto.js:193:15)
    at Object.logger (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/middleware/logger.js:158:5)
    at next (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/proto.js:193:15)
    at Object.staticMiddleware [as handle] (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/middleware/static.js:55:61)
    at next (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/proto.js:193:15)
TypeError: /Users/michaeljames/Documents/Projects/Proj/mean/app/views/includes/foot.jade:31
    29| script(type="text/javascript", src="/js/socketio/connect.js")
    30| 
  > 31| if (req.host='localhost')
    32|     //Livereload script rendered 
    33|     script(type='text/javascript', src='http://localhost:35729/livereload.js')  
    34| 

Cannot set property 'host' of undefined
    at eval (eval at <anonymous> (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/jade/lib/jade.js:152:8), <anonymous>:273:15)
    at /Users/michaeljames/Documents/Projects/Proj/mean/node_modules/jade/lib/jade.js:153:35
    at Object.exports.render (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/jade/lib/jade.js:197:10)
    at Object.exports.renderFile (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/jade/lib/jade.js:233:18)
    at View.exports.renderFile [as engine] (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/jade/lib/jade.js:218:21)
    at View.render (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/lib/view.js:76:8)
    at Function.app.render (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/lib/application.js:504:10)
    at ServerResponse.res.render (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/lib/response.js:801:7)
    at Object.handle (/Users/michaeljames/Documents/Projects/Proj/mean/config/express.js:82:29)
    at next (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/proto.js:188:17)

POST /api/0.1/people 500 618ms

我用的是meanstack。我有以下使用语句在我的express.js

//Set Request Size Limit
app.use(express.limit(100000000));

在fiddler中,我可以看到内容长度头的值为:1078702

我想这是八位字节,这是1.0787兆字节。

我不知道为什么express不让我发布json数组,我之前在另一个express项目中发布,该项目没有使用平均堆栈项目结构。


当前回答

2016年,以上都不适合我,直到我显式设置'类型'除了'限制'身体解析器,示例:

  var app = express();
  var jsonParser       = bodyParser.json({limit:1024*1024*20, type:'application/json'});
  var urlencodedParser = bodyParser.urlencoded({ extended:true,limit:1024*1024*20,type:'application/x-www-form-urlencoded' })

  app.use(jsonParser);
  app.use(urlencodedParser);

其他回答

对于那些在IIS下在Azure中启动NodeJS应用程序的人,不要忘记修改web。配置Azure应用服务IIS的“maxRequestLength”设置

为我工作:

配置nginx max file zise [https://patriciahillebrandt.com/nginx - 413 -请求-实体——太——large/] [1]

and

app.use(bodyParser.json({ limit: "200mb" }));
app.use(bodyParser.urlencoded({ limit: "200mb",  extended: true, parameterLimit: 1000000 }));

我使用了另一种方法来解决这个问题。

例子:

multer = require('multer');

var uploading = multer({
  limits: {fileSize: 1000000, files:1},
});

exports.uploadpictureone = function(req, res) {
  cloudinary.uploader.upload(req.body.url, function(result) {
    res.send(result);
  });
};

module.exports = function(app) {
    app.route('/api/upload', uploading).all(uploadPolicy.isAllowed)
        .post(upload.uploadpictureone);
};

我正在使用multer上传文件到AWS s3。 对于我来说,在添加client_max_body_size 100M之后;导入nginx文件, 误差是400。(但是413错误消失了,这意味着它成功地通过nginx到达了你的服务器)

解决方案如下: https://stackoverflow.com/a/71240419/15477963

我的app.js文件不需要改变,保持如下所示:

const express = require('express');
const bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

我最近也犯了同样的错误,我找到的所有解决方案都不管用。

经过一番挖掘,我发现设置app.use(express。bodyParser({限制:50 mb的}));你的限制设置正确了。

当添加一个console.log('Limit file size: '+ Limit);在node_modules/express/node_modules/connect/lib/middleware/json.js:46并重新启动节点,我在控制台中得到以下输出:

Limit file size: 1048576
connect.multipart() will be removed in connect 3.0
visit https://github.com/senchalabs/connect/wiki/Connect-3.0 for alternatives
connect.limit() will be removed in connect 3.0
Limit file size: 52428800
Express server listening on port 3002

首先,我们可以看到,在加载connect模块时,限制被设置为1mb(1048576字节)。然后,当我设置限制时,再次调用console.log,这一次限制是52428800 (50mb)。然而,我仍然得到一个413请求实体太大。

然后我添加console.log('限制文件大小:'+ Limit);在node_modules/express/node_modules/connect/node_modules/raw-body/index.js:10中,当使用大请求调用路由时(在错误输出之前),在控制台中看到了另一行:

Limit file size: 1048576

这意味着以某种方式,在某个地方,connect将重置限制参数并忽略我们指定的内容。我尝试在路由定义中单独指定bodyParser参数,但也没有成功。

虽然我没有找到任何合适的方法来永久地设置它,但你可以直接在模块中“修补”它。如果你使用的是Express 3.4.4,在node_modules/ Express /node_modules/connect/lib/middleware/json.js的第46行添加这个:

limit = 52428800; // for 50mb, this corresponds to the size in bytes

如果您没有运行相同版本的Express,行号可能会不同。 请注意,这是不好的做法,如果你更新你的模块,它将被覆盖。

因此,这个临时解决方案目前有效,但一旦找到解决方案(或模块修复,以防它是模块问题),您就应该相应地更新代码。

我已经在他们的GitHub上开了一个关于这个问题的问题。

[编辑-找到解决方案]

经过一些研究和测试,我发现在调试时,我添加了app.use(express。bodyParser({limit: '50mb'}));,但在app.use(express.json());之后。然后Express将全局限制设置为1mb,因为运行脚本时遇到的第一个解析器是Express .json()。将bodyParser移到上面就可以了。

也就是说,bodyParser()方法将在Connect 3.0中被弃用,不应该被使用。相反,你应该显式地声明你的解析器,就像这样:

app.use(express.json({limit: '50mb'}));
app.use(express.urlencoded({limit: '50mb'}));

如果你需要多部分(文件上传),请参阅这篇文章。

(第二个编辑)

注意,在Express 4中,你必须使用body解析器模块并使用它的json()和urlencoded()方法,而不是Express .json()和Express .urlencoded(),如下所示:

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

如果没有为bodyParser.urlencoded()显式定义扩展选项,它将抛出警告(body-parser不支持未定义扩展:提供扩展选项)。这是因为这个选项在下一个版本中是必需的,不再是可选的。有关扩展选项的更多信息,可以参考body-parser的自述文件。

(第三个编辑)

似乎在Express v4.16.0以后,我们可以回到最初的方式来做这件事(感谢@GBMan的提示):

app.use(express.json({limit: '50mb'}));
app.use(express.urlencoded({limit: '50mb'}));