【发布时间】:2012-09-23 02:25:08
【问题描述】:
我正在构建一个 express 应用程序,我想知道我对中间件的喜爱程度。大致上,我想用中间件完成以下工作。
完成:
- 将 requestId 添加到所有路由
- 验证请求
- 检查用户是否有权访问给定资源(除了 身份验证)
未完成:
- A) 验证给定路线的参数
- B) 如果中间件因路由而异,请以合理的方式组织中间件, 每条路由例行调用 3 个中间件
我已经在一个单独的文件中定义了我的中间件,并将其导入到 app.js 中,如下所示:
var middleware = require('./middleware');
var requestId = middleware.requestId;
var authenticate = middleware.authenticate;
要将其应用于所有路由,我将其添加到 express 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
});
对于路由细节,我将其添加为 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();
}
【问题讨论】:
-
你需要将 req, res 传递给你的中间件,所以 validate(req, res) 然后从那里开始操作。通常这比传入预先确定的变量要简单。
-
尝试查看 express-validator。我没有在中间件中使用过,但看起来可以:github.com/ctavan/express-validator
标签: node.js express middleware connect.js