2012-09-14 3 views
26

Ich bin neu bei node.js und Express und habe mit ihnen für eine Weile experimentiert. Jetzt bin ich verwirrt mit dem Design des Express-Frameworks im Zusammenhang mit dem Parsen des Anfragekörpers. Von der offiziellen Führung von Express:Node.js ausdrückliche korrekte Verwendung von bodyParser Middleware

app.use(express.bodyParser()); 
app.use(express.methodOverride()); 
app.use(app.router); 
app.use(logErrors); 
app.use(clientErrorHandler); 
app.use(errorHandler); 

Denn die Middleware einrichten, dann fügen wir die Route, die wir behandeln möchten:

app.post('/test', function(req, res){ 
    //do something with req.body  
}); 

Das Problem bei diesem Ansatz ist, dass all Anforderungstext wird zuerst geparst, bevor die Gültigkeit der Route überprüft wird. Es scheint sehr ineffizient zu sein, den Körper ungültiger Anfragen zu analysieren. Und noch mehr, wenn wir ermöglichen die Upload-Verarbeitung:

app.use(express.bodyParser({uploadDir: '/temp_dir'})); 

Jeder Client den Server durch das Hochladen alle Dateien bombardieren kann (auf Wunsch auf jedem Weg/Pfad zu senden !!), die alle, die verarbeitet werden und gehalten in der '/ temp_dir' Ich kann nicht glauben, dass diese Standardmethode weit verbreitet ist!

Wir können natürlich die Funktion bodyParser verwenden, wenn die Route definieren:

app.post('/test1', bodyParser, routeHandler1); 
app.post('/test2', bodyParser, routeHandler2); 

oder vielleicht sogar den Körper analysieren in jeder Funktion, die die Route handhaben. Dies ist jedoch mühsam zu tun.

Gibt es eine bessere Möglichkeit, express.bodyParser nur für alle gültigen (definierten) Routen zu verwenden und die Datei-Upload-Funktion nur auf ausgewählten Routen zu verwenden, ohne viele Code-Wiederholungen zu haben?

Antwort

30

Ihre zweite Methode ist in Ordnung. Denken Sie daran, dass Sie Arrays von Middleware-Funktionen auch an app.post, app.get und Freunde weitergeben können. Sie können also ein Array namens uploadMiddleware mit Ihren Dingen definieren, die mit POST-Körpern, Uploads usw. umgehen und diese verwenden.

app.post('/test1', uploadMiddleware, routeHandler1); 

Die Beispiele sind für Anfänger. Anfänger-Code, um Ihnen zu helfen, das verdammte Ding an Tag 1 arbeiten zu lassen und Produktionscode, der effizient und sicher ist, sind oft sehr unterschiedlich. Du machst einen sicherlich gültigen Punkt darüber, keine Uploads auf beliebige Pfade zu akzeptieren. Das Analysieren aller Anfragestellen, die "sehr ineffizient" sind, hängt von dem Verhältnis von ungültigen/Angriffs-POST-Anfragen zu legitimen Anfragen ab, die an Ihre Anwendung gesendet werden. Die durchschnittliche Hintergrundstrahlung von Angriffsprobeanforderungen reicht wahrscheinlich nicht aus, um sich Sorgen zu machen, bis Ihre Website populär wird.

Also here's a blog post with further details of the security considerations of bodyParser.

+1

Wow, upvote für vor Ihrer Antwort von einem Jahr erneuten Besuch jüngsten Entwicklungen umfassen re: 'bodyParser' –

+0

„Anfänger Code Sie das verdammte Ding arbeiten an Tag 1 und Produktionscode zu helfen, die effizient und sicher sind oft sehr unterschiedlich. " Amen. –