[javascript] 오류 : 요청 엔티티가 너무 큼

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 배열을 게시 할 수 없는지 모르겠습니다.



답변

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

파고 난 후에 그 설정을 찾았습니다 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'}));


답변

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


답변

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

client_max_body_size 100M; #100mb


답변

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

시험:

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


답변

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

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


답변

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


답변

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

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 일에 댓글을 달았습니다’참조