Estoy construyendo una aplicación exprés y me gustaría saber lo sofisticado que puedo llegar con el middleware. A grandes rasgos, quiero lograr lo siguiente con middleware.Node.js middleware organización y validación de parámetros
Hecho:
- Añadir RequestID a todas las rutas de solicitud
- Autenticación
- Comprobar si un usuario tiene acceso a un determinado recurso (aparte de autenticación)
no se realiza:
- A) parámetros Validar para una ruta dada
- B) Organizar middleware de una manera sana, si éste difiere de la ruta a la ruta, y 3 middlewares se llaman habitualmente por ruta
he definido mi middleware en un archivo separado, y la importación en app.js así:
var middleware = require('./middleware');
var requestId = middleware.requestId;
var authenticate = middleware.authenticate;
aplicarlo a todas las rutas que añadirlo a expresar config:
var app = express.createServer();
app.configure(function() {
app.use(express.logger());
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(requestId); // add requestId to all incoming requests
});
Y para obtener información específica de ruta, lo añado como argumento app.get:
var routes = require('./v1/routes');
app.get("/v1/foo", routes.foo);
app.get("/v1/bar", authenticate, routes.bar);
Problema Un
Me encantaría tener middleware que podría utilizar para comprobar los parámetros
validate('x','y','z')
y utilizarlo como tal para una ruta determinada:
app.get("/v1/bar", authenticate, validate('x','y','z'), routes.bar);
¿Hay una buena manera de hacerlo? ¿O debería simplemente estar validando por ruta dentro de los archivos de definición de ruta?
Problema B
¿Hay una mejor manera de organizar y usar mi middleware que debería tener en cuenta?
actualización
Busco una manera de validar los parámetros que cambian mucho entre rutas. Evidentemente, lo que sigue no funciona, no puedo pasar los parámetros al middleware, pero ¿hay alguna manera de definir el middleware que hace esto y llamarlo como ya he dicho?
var validateParams = function (req, res, params, callback) {
// Make sure the required parameters are in the request
console.log('checking for params '+params);
for (var i = 0; i < params.length; i++) {
var param = params[i];
if(!(param in req.query)){
logger.info('cannot find param ['+param+'] in req: '+JSON.stringify(req.query));
res.writeHead(400, {
"Content-Type": "application/json"
});
var out = {
"err": "request missing required parameters"
};
res.end(JSON.stringify(out));
return;
}
}
callback();
}
Querrá pasar req, res a su middleware así que valide (req, res) y luego actúe desde allí. Usualmente eso es más simple que pasar variables predeterminadas. – Brandon
Prueba a buscar en el validador expreso. No lo he usado en middleware, pero parece posible: https://github.com/ctavan/express-validator – chovy