2012-01-29 8 views
9

Używam Node.js i express.Node.js: jak ograniczyć rozmiar żądania HTTP i rozmiar wysyłanego pliku?

Chciałbym ograniczyć rozmiar żądania HTTP. Powiedzmy, że jeśli ktoś wyśle ​​mi żądanie HTTP o wartości przekraczającej 2 MB, natychmiast od razu odrzucę żądanie. Spojrzałem na kod i myślę, że jeśli zmienię rdzeń, mogę to zrobić. Czy jest jednak jakiś sposób, aby ustawić max_request_size lub coś podobnego?

Jest to związane z moim drugim pytaniem. Używam ekspresu, aby pobrać przesłany plik od req.files. Czy istnieje sposób, aby zatrzymać zapisywanie pliku w folderze /tmp (który jest domyślnym sposobem przesyłania), gdy rozmiar pliku przekroczy określony rozmiar pliku?

Odpowiedz

9

Express używa Connect, który ma a limit middleware available. Możesz użyć tego w swojej aplikacji Express, wykonując coś takiego:

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

To na przykład ograniczyłoby wszystkie żądania HTTP do 2 MB. Ponieważ przesłane pliki są częścią żądania HTTP, wszelkie pliki o wielkości przekraczającej 2 MB również zostałyby przerwane.


UWAGA: Ten middleware jest przestarzałe i wkrótce zostanie usunięta. Dyskusja o tym, dlaczego jest to sprawa jest dostępna pod adresem: https://github.com/senchalabs/connect/pull/925#issuecomment-26990726

+0

jeśli ograniczę się do 2 MB, a ja wysyłam żądanie http 1GB. Czy zatrzyma się od razu, jeśli przekroczy 2MB? lub zwraca błąd, ale nadal pobiera pozostałe dane z 0,998 GB? – murvinlai

+5

Źródło jest dostępne na stronie https://github.com/senchalabs/connect/blob/master/lib/middleware/limit.js. Jeśli czytam ją poprawnie, odczytuje ona porowate dane i kończy żądanie, gdy tylko przekroczy limit rozmiaru. –

+0

express.limit jest przestarzały na Nodejs 6 jako middleware – user1709076

14

właśnie aktualizacja (07-2014), a ja nie jestem w stanie dodać komentarz:

Jak słusznie zauważono powyżej, nowsze wersje ekspresowe są przestarzałe zastosowanie limit middleware i teraz dostarczyć go jako built-in option dla BodyParser middleware:

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

    var app = express() 
    app.use(bodyParser.json({ limit: '5mb' })) 
+0

To jest mi potrzebne. Dziękuję Ci. – emj365

+0

nie działa dla mnie w węźle 6 – user1709076

+0

jak mogę zwiększyć limit w przypadku modułu żądania – 981

0

Korzystając raw-body. Większość oprogramowania pośredniego (takiego jak limit) nie jest już dołączana do Express i musi być instalowana osobno. Oto przykład.

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) 
     }) 
    }) 
  • Pamiętaj, aby dodać router po app.use

ekspresowe nie pozwala jednoznacznie określić limit przy użyciu tradycyjnej dołączonego middleware jak pokazano poniżej.

0

odpowiedzi na Pytanie 1:

Aby ograniczyć rozmiar żądania HTTP i przesłać rozmiar pliku musimy ustawić limit body-parser.

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

bodyParser.urlencoded

Pliki z przednim końcu przychodzi jako urlencoded ciał.

Powoduje wyświetlenie oprogramowania pośredniego, które przetwarza tylko urlencoded bodies. Ten parser akceptuje tylko kodowanie UTF-8 ciała i obsługuje automatyczne nadymanie gzip i deflate kodowania.

Nowy obiekt bryły zawierający przeanalizowane dane jest zapełniany w obiekcie żądania po oprogramowaniu pośredniczącym (tj. Req.body). Obiekt ten będzie zawierał pary klucz-wartość, w których wartością może być ciąg lub tablica (gdy rozszerzony jest fałszem) lub dowolny typ (gdy rozszerzony jest prawdziwy).

bodyParser.json

Zwraca middleware, że tylko analizuje JSON. Ten parser akceptuje kodowanie Unicode ciała i obsługuje automatyczne nadpisywanie gzip i deflate kodowania.

Nowy obiekt bryły zawierający przeanalizowane dane jest zapełniany w obiekcie żądania po oprogramowaniu pośredniczącym (tj. Req.body).

Uwaga: Domyślnie granica wprowadzania do parsera ciała jest 100kb

Odpowiedź na pytanie 2:

Aby zmienić domyślny katalog wysyłania możemy użyć następujących.

app.set('uploadDir', './files'); // Sets the upload Directory to files folder in your project. 

Inne Wdrożenie

Choć w tym bodyParser do aplikacji możemy wspomnieć katalog przesyłania.

app.use(express.bodyParser({uploadDir:'./files', keepExtensions: true})); 

referencyjny:

Problemy: https://github.com/expressjs/express/issues/1684

Mam nadzieję, że to pomoże!

+0

Pytanie # 1 (i mój nacisk na nagrodę) dotyczy rozmiaru * żądania *, ale twoja odpowiedź dotyczy * rozmiaru * treści żądania *. linki referencyjne, które podasz: "Kontroluje maksymalny rozmiar ciała żądania". –

5

Kod źródłowy węzła 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 

Więc trzeba przebudować węzeł od źródła do przekroczenia limitu 80 * 1024

Można to wykorzystać z Express 4 do ograniczenia rozmiaru prośba ciała/Przesyłaj rozmiar pliku zamiast express.json() i express.urlencoded(), musisz wymagać modułu body-parser i użyć jego metod json() i urlencoded(), jeśli rozszerzona opcja nie jest jawnie zdefiniowana dla bodyParser. urlencoded(), rzuci ostrzeżenie (body-parser przestarzałe undefined extended: provide extended option).

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

Pytanie # 1 (i mój nacisk na nagrodę) dotyczy rozmiaru żądania, ale twoja odpowiedź dotyczy rozmiaru ciała żądania. Jest to wyraźnie wspomniane w bodyParser docs, że parametr limitu "Kontroluje maksymalny rozmiar ciała żądania." –

+0

Kod źródłowy węzła github:/* Dopuszczalny rozmiar nagłówka Maximium. Jeśli makro nie jest zdefiniowane * przed włączeniem tego nagłówka, domyślnie jest używany. maksymalny rozmiar nagłówka, zdefiniuj makro w środowisku kompilacji * (np. -DHTTP_MAX_HEADER_SIZE = ). usuń * efektywne ograniczenie wielkości nagłówka, zdefiniuj makro * na bardzo dużą liczbę (np. -DHTTP_MAX_HEADER_SIZE = 0x7fffffff) */ #ifndef HTTP_MAX_HEADER_SIZE #define HTTP_MAX_HEADER_SIZE (80 * 1024) #endif ... Tak, trzeba przebudować węzeł od źródła do przekroczenia limitu 80 * 1024 – AJS

Powiązane problemy