오류 : 요청 엔티티가 너무 큼


470

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

meanstack을 사용하고 있습니다. 내 express.js에 다음 사용 문장이 있습니다.

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

피들러 내에서 값이 1078702 인 콘텐츠 길이 헤더를 볼 수 있습니다

나는 이것이 옥텟에 있다고 믿습니다. 이것은 1.0787 메가 바이트입니다.

Express가 왜 평균 스택 프로젝트 구조를 사용하지 않는 다른 Express 프로젝트에 게시했던 json 배열을 게시 할 수 없는지 모르겠습니다.


5
이 질문에 나오는 모든 사람에게 빠른 참고 사항-문제가 실제로 노드 서버 또는 본문 파서인지 확인하십시오. 예를 들어 본문 파서를 올바르게 사용하고 있지만 NGINX conf 파일에서 최대 본문 크기를 설정했기 때문에이 오류가 발생했습니다.
Stephen Tetreault '12

@StephenTetreault 나는 그것을 대답으로 추가해야한다고 생각합니다. 물론 그것은 모든 사람에게 적용되지는 않지만, 정확히 나에게 일어난 일이었습니다.
Dado

답변:


991

최근에 같은 오류가 있었고 찾은 모든 솔루션이 작동하지 않았습니다.

파고 난 후에 그 설정을 찾았습니다 app.use(express.bodyParser({limit: '50mb'})); 설정이 한계를 올바르게 .

을 추가하는 경우 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 Request entity too large.

그럼 추가 console.log('Limit file size: '+limit);node_modules/express/node_modules/connect/node_modules/raw-body/index.js:10과 (오류 출력 전) 큰 요청 경로를 호출하는 콘솔의 또 다른 라인을 보았다 :

Limit file size: 1048576

이것은 어딘가에 connectlimit 매개 변수를 재설정하고 지정한 것을 무시 한다는 것을 의미 합니다. bodyParser경로 정의에서 매개 변수를 개별적으로 지정하려고 시도 했지만 운이 좋지 않습니다.

영구적으로 설정하는 적절한 방법을 찾지 못했지만 모듈에서 직접 " 패치 " 할 수 있습니다. Express 3.4.4를 사용하는 경우 다음 중 46 행에이를 추가하십시오 node_modules/express/node_modules/connect/lib/middleware/json.js.

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에서는 express.json()and 대신에 body-parser 모듈이 express.urlencoded()필요하며 다음 과 같이 and 메소드를 사용해야합니다 .json()urlencoded()

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

에 대해 extended옵션이 명시 적으로 정의되어 있지 않으면 bodyParser.urlencoded()경고 ( body-parser deprecated undefined extended: provide extended option)가 발생합니다. 이 옵션은 다음 버전에서 필요하며 더 이상 선택 사항 이 아니기 때문입니다. 에 대한 추가 정보를 원하시면 extended옵션, 당신은 참조 할 수 있습니다 추가 정보body-parser .

[제 3 편집]

Express v4.16.0부터는이 작업을 수행하는 초기 방법으로 돌아갈 수 있습니다 (팁을 위해 @GBMan 덕분에).

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

7
내 문제는 내가 bodyParser 위에 express.json () 파서를 가지고 있다는 것입니다 ... 그것이 어떻게 작동하는지 이해 한 후에 bodyParser를 제거하고 다른 것과 같이 제한을 설정했습니다 app.use(express.json({limit:'50mb'}));. 이것을 반영하기 위해 답변을 편집했습니다!
Samuel Bolduc

2
Express 4의 경우, 표시된 코드는 urlencoded호출시 "본문 파서 더 이상 사용되지 않는 확장 : 확장 옵션 제공"
Mike 'Pomax'Kamermans

3
express 4에 대해 이것을 업데이트 해 주셔서 감사합니다. 당신은 생명의 은인입니다!
Swills

36
이것은이 답변이 얻는 것만 큼 포괄적이므로 나중에 node.js / express 인스턴스 앞에서 리버스 프록시로 nginx를 사용하는 경우 나중에 참조 할 수있는 또 다른 요점이 있습니다.이 방법도 권장됩니다. Nginx는 동일한 413::Request Entity is too large예외를 발생시킵니다. Express 앱에 요청을 전달하지 않습니다. 따라서 client_max_body_size 50M;nginx 설정이나 특정 서버 설정 또는 특정 위치 태그가 작동하도록 설정해야합니다.
Aukhan

3
이것에 대해 사무엘 감사합니다! 종합적인 답변을 위해 두통, 건배 및 +1의 세계에서 나를 구했습니다!
BastianBuhrkall

117

Express 4를 사용합니다.

필자의 경우 다음 줄을 추가하기에 충분하지 않았습니다.

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

설명서에 설명되어 있고 오류가 더 이상 나타나지 않으므로 urlencoded 함수에 parameterLimit 옵션을 추가하려고했습니다.

parameterLimit 옵션은 URL 인코딩 데이터에 허용되는 최대 매개 변수 수를 제어합니다. 요청에이 값보다 많은 매개 변수가 포함 된 경우 413이 클라이언트로 리턴됩니다. 기본값은 1000입니다.

이 코드로 시도하십시오 :

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

parameterLimit은 내가 놓친 또 다른 문제였습니다.이 점을 지적 해 주셔서 감사합니다.
crowebird

1
"parameterLimit : 50000"을 추가하면 문제가 해결됩니다.
Andrien Pecson

1
이 답변을 찾을 때까지 나는 이것에 너무 열심히 노력하고있었습니다. 감사합니다! # 릴리 브
스테판 셀리스

이것이 바로 내가 찾던 것입니다!
ApplePie

나는 표시된 솔루션으로 고심하고 있었지만 이것은 많은 도움이됩니다.
Ahmed Khan

55

누군가가 모든 답변을 시도했지만 아직 성공하지 못했지만 NGINX를 사용하여 사이트를 호스팅하는 경우 / etc / nginx / sites-available에이 줄을 추가하십시오

client_max_body_size 100M; #100mb

4
이것은 내 문제였습니다, 감사합니다! 한 가지 단서는 nginx의 기본값이 1MB라는 것입니다. 따라서 그 양으로 제한되는 것으로 보이면 아마도 nginx 일 것입니다. 또한, 또 다른 단서 : body-parser 리턴limit 속성과 length(와 함께 오류 개체의 속성을 status:413). Nginx는 이것을하지 않습니다. 따라서 오류 객체에서 해당 속성을 볼 수 없다면 아마도 nginx 한도 일 것입니다. 여기 (대부분의 설정 파일이의 nginx 설정을 변경하는 방법 /etc/nginx/sites-available/)

2
이 답변에 대해 대단히 감사합니다.이 답변은 중요하기 때문에이 답변이 공표되어야한다고 생각합니다. 개인적으로 nginx 구성에 대해 잊어 버렸습니다 ... 다시 큰 감사합니다
Fadi Abo Msalam

급행에서만 제한을 설정하는 방법은 무엇입니까?
lex 렉스 dykyі

@ аlexdykyі Vivek22의 답변 : app.use (bodyParser ({limit : '50mb'}));
Alexander

이것은 문제였다! 감사합니다!
Victor

31

나는 이것이 세계적인 규모 제한이라고 생각하지 않지만 특히 connect.json 미들웨어 한계 라고 생각합니다 . 옵션 을 사용 express.bodyParser()하지 않고 사용 하지 않으면 기본적으로 100kb limit입니다.

시험:

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

1
안녕-나는 다음을 사용하고 있습니다 : app.get ( '/ api / 0.1 / people /', express.bodyParser ({limit : '100mb'}), tracks.all); 나는 여전히 같은 오류가 발생합니다 ...
마이크 제임스

기본 제한은 지금 보인다 100kbyte입니다 github.com/expressjs/body-parser#limit
Qiong 우

15

내 경우에는 .. 설정 parameterLimit:50000으로 문제가 해결되었습니다.

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

이것은 나를 위해 일했습니다. "요청 엔터티가 너무 큼"은 JSON과 같은 큰 문자열도 나타내는 것으로 보입니다. ~ 20Kib JSON을 게시하고 있었고이 문제가 발생했습니다 (기본 body-parser페이로드 크기 제한이 나에게 좋습니다). parameterLimit만으로 해결되었습니다 ( limits 를 설정할 필요가 없음 ).
aesede

13

2016 년, bodyparser의 'limit'외에도 'type'을 명시 적으로 설정할 때까지 위의 어느 것도 나를 위해 일하지 않았습니다.

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

예, 이것이 제가해야 할 일입니다. 그리고 앱 스크립트에서 구성 설정을 실행할 수 있도록 설정되었습니다.
Robb Sadler

3
application/x-www-form-urlencoded(이 아닌 application/x-www-form-urlencoding) 을 의미 했 습니까?
수류탄

12

다음은 나를 위해 일했습니다 ... 그냥 사용하십시오.

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

그게 다야.

위의 모든 것을 시도했지만 아무도 효과가 없었습니다. 다음과 같이 사용하더라도

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

첫 번째 app.use(bodyParser());행만 정의되고 두 번째 행은 무시됩니다.

참조 : https://github.com/expressjs/body-parser/issues/176 >> 'dougwilson이 2016 년 6 월 17 일에 댓글을 달았습니다'참조


1
감사합니다! 나는 또한 오래된 app.use (bodyParser.json ()); 내 코드에서 실제로 실제로 첫 번째 코드 만 사용됩니다!
니코

8

express ~ 4.16.0의 경우 제한이있는 express.json이 직접 작동합니다.

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

6

내 경우에는 Nginx 구성 에 문제가있었습니다 . 그것을 해결하려면 파일을 편집하고 /etc/nginx/nginx.conf서버 블록 안에이 줄을 추가해야합니다.

client_max_body_size 5M;

Nginx를 다시 시작하면 문제가 사라집니다.

sudo systemctl restart nginx

5

나는이 문제에 대해 다른 의존성을 사용하는 또 다른 방법을 사용했습니다.

예:

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

오래된 게시물이지만 같은 문제가 있습니다.

express 4. +를 사용하면 내 코드는 다음과 같으며 이틀간의 광범위한 테스트 후에 훌륭하게 작동합니다.

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

약간 다른 접근법-페이로드는 너무 큽니다.

지금까지의 모든 유용한 답변은 페이로드 제한을 늘리는 것과 관련이 있습니다. 그러나 페이로드가 실제로 너무 크지 만 아무런 이유가없는 경우도 있습니다. 그럴만한 이유가 없다면 처음에 왜 부풀어 오른 지 살펴보십시오.

우리 자신의 경험

예를 들어, 우리의 경우 Angular 앱은 전체 객체를 탐욕스럽게 욕설로 보냈습니다. 부풀어 오른 중복 속성 하나를 제거 하면 페이로드 크기가 100 배 줄어 듭니다 . 이로써 성능이 크게 향상되고 413 오류가 해결되었습니다.


4

많은 시도 후 내 솔루션을 얻었습니다.

이 줄에 댓글을 달았습니다

app.use(bodyParser.json());

그리고 나는 넣어

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

그런 다음 작동합니다


3

스 니펫을 따라 문제를 해결했습니다.

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

2

주어진 줄에 표시된대로 파일 크기 제한을 더 잘 사용할 수 있습니다.

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

node-modules body-parser에서 기본 설정을 변경 한 다음 lib 폴더에 JSON 및 텍스트 파일이 있습니다. 그런 다음 여기에서 한계를 변경하십시오. 실제로, 주어진 app.use (bodyParser.json ({limit : '10mb', extended : true})) 행에서 limit 매개 변수를 전달하지 않으면이 조건이 전달됩니다.


1

나도 그 문제에 직면했다 app.use(bodyParser.json()). 아래와 같이 반복하여 바보 같은 실수를 저지르고 있었다 .

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

를 제거 app.use(bodyParser.json())하여 문제를 해결했습니다.


1

필자의 경우 Content-type요청 헤더에서 제거 하는 것이 효과가있었습니다.


0

나에게 주요 요령은

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

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

bodyParse.json 첫 번째 bodyParse.urlencoded 두 번째


0

express.json()bodyParser를 함께 사용하는 경우 express가 자체 제한을 설정하므로 오류가 발생합니다.

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

위의 코드를 제거하고 코드 아래에 추가하십시오.

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

@ tomislav-stankovic를 포맷 해 주셔서 감사합니다
NIKIT PULEKAR
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.