2012-09-14 14 views
26

Soy nuevo en node.js y lo expreso y he estado experimentando con ellos por un tiempo. Ahora estoy confundido con el diseño del marco expreso relacionado con el análisis del cuerpo de la solicitud. De la guía oficial de expreso:Node.js expresa el uso correcto de bodyParser middleware

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

Después de configurar todo el middleware, a continuación, añadimos la ruta que queremos manejar:

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

El problema con este enfoque es que todo cuerpo de la petición se analizará primero antes de verificar la validez de la ruta. Parece muy ineficiente analizar el cuerpo de solicitudes inválidas. Y aún más, si nos permiten el procesamiento de carga:

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

cualquier cliente puede bombardear el servidor mediante la subida de los archivos (mediante el envío de solicitud para cualquier ruta/trayectoria !!), todo lo cual será objeto de tratamiento y se mantiene en el '/ temp_dir'. ¡No puedo creer que este método predeterminado esté siendo ampliamente promocionado!

Podemos utilizar, por supuesto, la función bodyParser la hora de definir la ruta:

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

o incluso tal vez analizar el cuerpo de cada función que se encargan de la ruta. Sin embargo, esto es tedioso de hacer.

¿Hay alguna forma mejor de usar express.bodyParser para todas las rutas válidas (definidas) solamente, y para usar la capacidad de manejo de carga de archivos solo en rutas seleccionadas, sin tener que repetir muchas veces el código?

Respuesta

30

Su segundo método está bien. Recuerde que también puede pasar matrices de funciones de middleware al app.post, app.get y amigos. De modo que puede definir una matriz llamada uploadMiddleware con sus cosas que manejan cuerpos POST, cargas, etc., y usar eso.

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

Los ejemplos son para principiantes. El código de principiante para ayudarlo a hacer que la maldita cosa funcione el día 1 y el código de producción que es eficiente y seguro a menudo son muy diferentes. Usted hace un punto ciertamente válido acerca de no aceptar subidas a rutas arbitrarias. En cuanto a analizar todos los cuerpos de solicitud siendo 'muy ineficientes', eso depende de la proporción de solicitudes POST inválidas/de ataque a solicitudes legítimas que se envían a su aplicación. La radiación de fondo promedio de las solicitudes de sonda de ataque probablemente no sea suficiente para preocuparse hasta que su sitio comience a ser popular.

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

+1

Wow, upvote para reconsiderar su respuesta desde hace más de un año para incluir desarrollos recientes RE: 'bodyParser' –

+0

"código Principiante para ayudarle a obtener el maldito trabajo el día 1 y el código de producción que sea eficiente y seguros son a menudo muy diferentes ". Amén. –