我正在构建一个快速应用程序,我想知道我能用中间件获得多少。粗略地说,我想用中间件完成以下工作。
完毕:
- 将 requestId 添加到所有路由
- 验证请求
- 检查用户是否有权访问给定资源(身份验证除外)
尚未完成:
- A)验证给定路由的参数
- B)如果中间件因路由而异,则以合理的方式组织中间件,并且每个路由例行调用 3 个中间件
我在一个单独的文件中定义了我的中间件,并将其导入 app.js,如下所示:
var middleware = require('./middleware');
var requestId = middleware.requestId;
var authenticate = middleware.authenticate;
要将其应用于所有路由,我将其添加到 express 配置中:
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
});
对于路线细节,我将其添加为 app.get 参数:
var routes = require('./v1/routes');
app.get("/v1/foo", routes.foo);
app.get("/v1/bar", authenticate, routes.bar);
问题A
我很想拥有可以用来检查参数的中间件
validate('x','y','z')
并像这样对给定的路线使用它:
app.get("/v1/bar", authenticate, validate('x','y','z'), routes.bar);
有没有好的方法来做到这一点?或者我应该只是在路由定义文件中基于每个路由进行验证?
问题 B
有没有更好的方法来组织和使用我应该考虑的中间件?
更新
我正在寻找一种方法来验证路由之间变化很大的参数。下面显然不起作用-我不能将参数传递给中间件-但是有没有办法可以定义中间件来执行此操作并按照我上面所说的那样调用它?
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();
}