Lỗi: yêu cầu thực thể quá lớn


471

Tôi đang nhận được lỗi sau với express:

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

Tôi đang sử dụng meanstack. Tôi có các câu lệnh sử dụng sau trong express.js của mình

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

Trong fiddler tôi có thể thấy tiêu đề có độ dài nội dung với giá trị là: 1078702

Tôi tin rằng đây là trong octet, đây là 1,0787 megabyte.

Tôi không biết tại sao express không cho phép tôi đăng mảng json mà tôi đã đăng trước đó trong một dự án express khác không sử dụng cấu trúc dự án ngăn xếp trung bình.


5
lưu ý nhanh về vấn đề này cho bất kỳ ai đến với câu hỏi này - đảm bảo vấn đề của bạn thực sự là máy chủ nút hoặc trình phân tích cú pháp cơ thể. Ví dụ: tôi đang sử dụng trình phân tích cú pháp cơ thể một cách chính xác nhưng tôi đã gặp lỗi này vì tôi đã đặt kích thước cơ thể tối đa trong tệp conf NGINX.
Stephen Tetreault

@StephenTetreault Tôi nghĩ bạn nên thêm nó như một câu trả lời, trong khi tất nhiên nó sẽ không áp dụng cho tất cả mọi người, đó chính xác là những gì đang xảy ra với tôi, kudos.
Dado

Câu trả lời:


991

Gần đây tôi đã gặp lỗi tương tự và tất cả các giải pháp tôi tìm thấy đều không hoạt động.

Sau khi đào, tôi thấy rằng cài đặt app.use(express.bodyParser({limit: '50mb'}));đã đặt giới hạn chính xác.

Khi thêm một nút console.log('Limit file size: '+limit);vào node_modules/express/node_modules/connect/lib/middleware/json.js:46và khởi động lại, tôi nhận được đầu ra này trong bàn điều khiển:

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

Chúng ta có thể thấy rằng lúc đầu, khi tải connectmô-đun, giới hạn được đặt thành 1mb (1048576 byte). Sau đó, khi tôi đặt giới hạn, console.logđược gọi lại và lần này giới hạn là 52428800 (50mb). Tuy nhiên, tôi vẫn nhận được a 413 Request entity too large.

Sau đó, tôi đã thêm console.log('Limit file size: '+limit);vào node_modules/express/node_modules/connect/node_modules/raw-body/index.js:10và thấy một dòng khác trong bảng điều khiển khi gọi tuyến đường với một yêu cầu lớn (trước khi xuất lỗi):

Limit file size: 1048576

Điều này có nghĩa là bằng cách nào đó, ở đâu đó, connectđặt lại tham số giới hạn và bỏ qua những gì chúng tôi đã chỉ định. Tôi đã cố gắng chỉ định các bodyParsertham số trong định nghĩa tuyến đường riêng lẻ, nhưng cũng không có may mắn.

Mặc dù tôi không tìm thấy bất kỳ cách thích hợp nào để đặt nó vĩnh viễn, bạn có thể " " nó trực tiếp trong mô-đun. Nếu bạn đang sử dụng Express 3.4.4, hãy thêm phần này vào dòng 46 của node_modules/express/node_modules/connect/lib/middleware/json.js:

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

Số dòng có thể khác nhau nếu bạn không chạy cùng một phiên bản Express. Xin lưu ý rằng đây là thực tiễn xấu và nó sẽ bị ghi đè nếu bạn cập nhật mô-đun của mình.

Vì vậy, giải pháp tạm thời này hoạt động ngay bây giờ, nhưng ngay khi tìm thấy giải pháp (hoặc mô-đun đã được sửa, trong trường hợp đó là sự cố mô-đun), bạn nên cập nhật mã của mình cho phù hợp.

Tôi đã mở một vấn đề trên GitHub của họ về vấn đề này.

[chỉnh sửa - tìm thấy giải pháp]

Sau một số nghiên cứu và thử nghiệm, tôi thấy rằng khi gỡ lỗi, tôi đã thêm app.use(express.bodyParser({limit: '50mb'}));, nhưng sau đó app.use(express.json()); . Express sau đó sẽ đặt giới hạn toàn cầu thành 1mb vì trình phân tích cú pháp đầu tiên anh gặp phải khi chạy tập lệnh express.json(). Di chuyển bodyParsertrên nó đã lừa

Điều đó nói rằng, bodyParser()phương thức này sẽ không được dùng trong Connect 3.0 và không nên được sử dụng. Thay vào đó, bạn nên khai báo các trình phân tích cú pháp một cách rõ ràng, như vậy:

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

Trong trường hợp bạn cần nhiều phần (để tải tệp lên) hãy xem bài đăng này .

[chỉnh sửa thứ hai]

Lưu ý rằng trong Express 4, thay vì express.json()express.urlencoded(), bạn phải yêu cầu mô-đun trình phân tích cú pháp cơ thể và sử dụng nó json()urlencoded()các phương thức, như vậy:

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

Nếu extendedtùy chọn không được xác định rõ ràng bodyParser.urlencoded(), nó sẽ đưa ra cảnh báo ( body-parser deprecated undefined extended: provide extended option). Điều này là do tùy chọn này sẽ được yêu cầu trong phiên bản tiếp theo và sẽ không còn là tùy chọn nữa. Để biết thêm thông tin về extendedtùy chọn, bạn có thể tham khảo readme của body-parser.

[chỉnh sửa thứ ba]

Có vẻ như trong Express v4.16.0 trở đi, chúng ta có thể quay lại cách ban đầu để thực hiện việc này (nhờ @GBMan cho mẹo):

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

7
Vấn đề của tôi là tôi đã có trình phân tích cú pháp express.json () phía trên bodyParser của mình ... Sau khi hiểu cách thức hoạt động của tất cả, tôi đã loại bỏ bodyParser và đặt giới hạn khác app.use(express.json({limit:'50mb'}));. Tôi đã chỉnh sửa câu trả lời của mình để phản ánh điều này!
Samuel Bolduc

2
đối với express 4, mã được chỉ định ném "trình phân tích cú pháp cơ thể không được xác định mở rộng: cung cấp tùy chọn mở rộng" cho urlencodedcuộc gọi
Mike 'Pomax' Kamermans

3
Cảm ơn bạn đã cập nhật thông tin này cho express 4. Bạn là một người bảo vệ cuộc sống!
Swills

36
Đây là toàn diện như câu trả lời này nhận được, vì vậy có thêm một điểm để tham khảo trong tương lai mà tôi gặp phải nếu bạn đang sử dụng nginx làm proxy ngược trước ví dụ node.js / express, cũng được khuyến nghị thực hành. Nginx sẽ ném 413::Request Entity is too largengoại lệ tương tự . Nó sẽ không chuyển tiếp yêu cầu đến ứng dụng thể hiện của bạn. Vì vậy, chúng ta cần phải thiết lập client_max_body_size 50M;cấu hình nginx HOẶC một cấu hình máy chủ cụ thể HOẶC thậm chí một thẻ vị trí cụ thể sẽ hoạt động.
Aukhan 16/2/2016

3
Cảm ơn bạn samuel vì điều này! Cứu tôi khỏi một thế giới đau đầu, Chúc mừng và +1 cho câu trả lời toàn diện!
BastianBuhrkall

117

Tôi sử dụng Express 4.

Trong trường hợp của tôi, nó không đủ để thêm những dòng này:

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

Tôi đã thử thêm tùy chọn tham sốLimit trên hàm urlencoding như tài liệu nói và lỗi không còn xuất hiện.

Tùy chọn tham sốLimit kiểm soát số lượng tham số tối đa được phép trong dữ liệu được mã hóa URL. Nếu một yêu cầu chứa nhiều tham số hơn giá trị này, 413 sẽ được trả về máy khách. Mặc định là 1000.

Hãy thử với mã này:

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

Tham sốLimit là một gotcha khác mà tôi đã thiếu, cảm ơn vì đã chỉ ra điều này.
crowebird

1
Thêm "tham sốLimit: 50000" sẽ giải quyết vấn đề.
Andrien Pecson

1
Tôi đã đấu tranh rất nhiều về điều này cho đến khi tôi tìm thấy câu trả lời này. CẢM ƠN BẠN! #Release
Stephan Celis

Điều này thật đúng với gì mà tôi đã tìm kiếm!
ApplePie

Tôi đã vật lộn với giải pháp được đánh dấu nhưng điều này giúp ích rất nhiều.
Ahmed Khan

55

Nếu ai đó đã thử tất cả các câu trả lời, nhưng chưa có thành công nào và sử dụng NGINX để lưu trữ trang web, hãy thêm dòng này vào / etc / nginx / site-Available

client_max_body_size 100M; #100mb

4
Đây là vấn đề của tôi, cảm ơn! Một manh mối là mặc định của nginx là 1MB, vì vậy nếu bạn dường như bị giới hạn ở số tiền đó thì có lẽ là nginx. Ngoài ra, một manh mối khác: body-parser sẽ trả về một thuộc limittính và một lengththuộc tính trong đối tượng lỗi (cùng với status:413). Nginx không làm điều này. Vì vậy, nếu bạn không thể thấy các thuộc tính đó trong đối tượng lỗi, thì đó có thể là giới hạn nginx. Dưới đây là cách thay đổi cài đặt nginx này (tệp cấu hình rất có thể trong /etc/nginx/sites-available/)

2
cảm ơn bạn rất nhiều vì câu trả lời này tôi tin rằng câu trả lời này nên được nâng cấp bởi vì nó rất quan trọng, cá nhân tôi đã quên cấu hình nginx ... một lần nữa cảm ơn bạn rất nhiều
Fadi Abo Msalam

Làm thế nào để đặt giới hạn chỉ trong express?
аlex dyky giác

@ аlexdykyі Trả lời từ Vivek22: app.use (bodyParser ({giới hạn: '50mb'}));
Alexander

đây là một vấn đề cảm ơn bạn!
Victor

31

Tôi không nghĩ rằng đây là giới hạn kích thước toàn cầu rõ ràng, nhưng cụ thể là giới hạn phần mềm trung gian connect.json . Đây là 100kb theo mặc định khi bạn sử dụng express.bodyParser()và không cung cấp limittùy chọn.

Thử:

app.post('/api/0.1/people', express.bodyParser({limit: '5mb'}), yourHandler);

1
Xin chào - Tôi đang sử dụng các mục sau: app.get ('/ api / 0.1 / people /', express.bodyParser ({giới hạn: '100mb'}), track.all); Tôi vẫn nhận được lỗi tương tự ...
mike james

giới hạn mặc định là 100kbyte vì dường như bây giờ github.com/expressjs/body-parser#limit
Qiong Wu

15

trong trường hợp của tôi .. cài đặt đã parameterLimit:50000khắc phục sự cố

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

Điều này làm việc cho tôi. "Thực thể yêu cầu quá lớn" dường như cũng đề cập đến các chuỗi lớn (như JSON). Tôi đã đăng ~ 20Kib JSON và gặp sự cố này (lưu ý rằng giới hạn kích thướcbody-parser tải trọng mặc định là phù hợp với tôi). Đã được giải quyết chỉ với (không cần thiết lập bất kỳ s). parameterLimitlimit
aesede

13

Năm 2016, không có cách nào ở trên hoạt động với tôi cho đến khi tôi khám phá đặt 'loại' ngoài 'giới hạn' cho bodyparser, ví dụ:

  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);

Vâng, đây là những gì tôi cần phải làm cũng. Và nó đã được thiết lập để bạn có thể điều khiển cài đặt cấu hình từ tập lệnh ứng dụng của mình.
Robb Sadler

3
ý bạn là application/x-www-form-urlencoded(chứ không phải application/x-www-form-urlencoding)?
lựu đạn

12

Những điều sau đây làm việc cho tôi ... Chỉ cần sử dụng

app.use(bodyParser({limit: '50mb'}));

đó là nó.

Đã thử tất cả ở trên và không làm việc. Tìm thấy rằng mặc dù chúng tôi sử dụng như sau,

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

chỉ có cái đầu tiên app.use(bodyParser());được xác định và hai dòng sau bị bỏ qua.

Tham khảo: https://github.com/expressjs/body-parser/issues/176 >> xem 'dougwilson đã nhận xét vào ngày 17 tháng 6 năm 2016'


1
CẢM ƠN BẠN! Tôi cũng đã có một app.use cũ (bodyParser.json ()); trong mã của tôi trước đây và thực sự, chỉ có cái đầu tiên được thực hiện!
Nico

8

Đối với express ~ 4.16.0, express.json với giới hạn hoạt động trực tiếp

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

6

Trong trường hợp của tôi, vấn đề là về cấu hình Nginx . Để giải quyết nó, tôi phải chỉnh sửa tệp: /etc/nginx/nginx.confvà thêm dòng này vào bên trong khối máy chủ:

client_max_body_size 5M;

Khởi động lại Nginx và các vấn đề đã biến mất

sudo systemctl restart nginx

5

Tôi đã sử dụng một thực tiễn khác cho vấn đề này với người phụ thuộc multer.

Thí dụ:

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);
};

5

Bài cũ ít nhưng tôi có cùng một vấn đề

Sử dụng express 4. + mã của tôi trông như thế này và nó hoạt động rất tốt sau hai ngày thử nghiệm rộng rãi.

var url         = require('url'),
    homePath    = __dirname + '/../',
    apiV1       = require(homePath + 'api/v1/start'),
    bodyParser  = require('body-parser').json({limit:'100mb'});

module.exports = function(app){
    app.get('/', function (req, res) {
        res.render( homePath + 'public/template/index');
    });

    app.get('/api/v1/', function (req, res) {
        var query = url.parse(req.url).query;
        if ( !query ) {
            res.redirect('/');
        }
        apiV1( 'GET', query, function (response) {
            res.json(response);
        });
    });

    app.get('*', function (req,res) {
        res.redirect('/');
    });

    app.post('/api/v1/', bodyParser, function (req, res) {
        if ( !req.body ) {
            res.json({
                status: 'error',
                response: 'No data to parse'
            });
        }
        apiV1( 'POST', req.body, function (response) {
            res.json(response);
        });
    });
};

4

Một cách tiếp cận hơi khác - tải trọng quá LỚN

Tất cả các câu trả lời hữu ích cho đến nay đối phó với việc tăng giới hạn tải trọng. Nhưng nó cũng có thể là trường hợp tải trọng thực sự quá lớn nhưng không có lý do chính đáng. Nếu không có lý do chính đáng cho điều đó, hãy xem xét lý do tại sao nó lại nở rộ như vậy ngay từ đầu.

Kinh nghiệm của chúng ta

Ví dụ, trong trường hợp của chúng tôi, một ứng dụng Angular đã tham lam gửi toàn bộ một đối tượng trong tải trọng. Khi một tài sản cồng kềnh và dư thừa bị xóa, kích thước tải trọng đã giảm đi 100% . Điều này cải thiện đáng kể hiệu suất và giải quyết lỗi 413.


4

Sau nhiều lần thử, tôi đã có giải pháp

Tôi đã nhận xét dòng này

app.use(bodyParser.json());

và tôi đặt

app.use(bodyParser.json({limit: '50mb'}))

Sau đó, nó hoạt động


3

cho tôi theo đoạn trích đã giải quyết vấn đề.

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

2

Việc sử dụng tốt hơn bạn có thể chỉ định giới hạn kích thước tệp của mình vì nó được hiển thị trong các dòng nhất định:

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

Bạn cũng có thể thay đổi cài đặt mặc định trong trình phân tích cú pháp cơ thể mô-đun nút sau đó trong thư mục lib, có tệp JSON và tệp văn bản. Sau đó thay đổi giới hạn ở đây. Trên thực tế, điều kiện này vượt qua nếu bạn không vượt qua tham số giới hạn trong ứng dụng dòng đã cho.use (bodyParser.json ({giới hạn: '10mb', mở rộng: true})).


1

Tôi cũng đối mặt với vấn đề đó, tôi đã phạm một lỗi ngớ ngẩn bằng cách lặp lại app.use(bodyParser.json())như sau:

app.use(bodyParser.json())
app.use(bodyParser.json({ limit: '50mb' }))

bằng cách loại bỏ app.use(bodyParser.json()), giải quyết vấn đề.


1

Trong trường hợp của tôi loại bỏ Content-typekhỏi các tiêu đề yêu cầu làm việc.


0

Đối với tôi, mẹo chính là

app.use(bodyParser.json({
  limit: '20mb'
}));

app.use(bodyParser.urlencoded({
  limit: '20mb',
  parameterLimit: 100000,
  extended: true 
}));

bodyPude.json đầu tiên bodyPude.urlencoding thứ hai


0

Nếu bạn đang sử dụng express.json()bodyParser cùng nhau, nó sẽ báo lỗi vì express đặt giới hạn riêng của nó.

app.use(express.json());
app.use(express.urlencoded({ extended: false }));

loại bỏ mã trên và chỉ cần thêm mã dưới đây

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

cảm ơn vì định dạng @ tomislav-stankovic
NIKIT PULEKAR
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.