nfl*_*cco 8 middleware node.js express connect.js
我正在构建一个快速应用程序,我想知道我可以用中间件获得多么的花哨.粗略地说,我想用中间件完成以下任务.
完成:
尚未完成:
我已经在一个单独的文件中定义了我的中间件,并将其导入app.js,如下所示:
var middleware = require('./middleware');
var requestId = middleware.requestId;
var authenticate = middleware.authenticate;
Run Code Online (Sandbox Code Playgroud)
要将它应用于所有路由,我将其添加到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
});
Run Code Online (Sandbox Code Playgroud)
对于路由细节,我将其添加为app.get参数:
var routes = require('./v1/routes');
app.get("/v1/foo", routes.foo);
app.get("/v1/bar", authenticate, routes.bar);
Run Code Online (Sandbox Code Playgroud)
问题A.
我很想拥有可以用来检查参数的中间件
validate('x','y','z')
Run Code Online (Sandbox Code Playgroud)
并且对于给定的路线使用它是这样的:
app.get("/v1/bar", authenticate, validate('x','y','z'), routes.bar);
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?或者我应该在路由定义文件中基于每个路由进行验证?
问题B
是否有更好的方法来组织和使用我应该考虑的中间件?
更新
我正在寻找一种方法来验证路由之间变化很大的参数.下面显然不起作用 - 我无法将params传递到中间件 - 但是我可以通过这种方式定义中间件来执行此操作并按照我上面所述的方式调用它吗?
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();
}
Run Code Online (Sandbox Code Playgroud)
问题A
app.get("/v1/bar", authenticate, validate, routes.bar);
function validate(req,res,next){
//Get all parameters here by req.params and req.body.parameter
//validate them and return.
if(validation_true)
next()
}
Run Code Online (Sandbox Code Playgroud)
问题B
您可以以一种并不总是需要调用身份验证和验证它们被自动调用的方式使用中间件。但这可能会导致混乱,例如。然后,您的中间件将在每次调用时运行,因此对于注册/注册,没有必要运行身份验证。
使用验证,有时您需要验证电子邮件,有时需要验证电话号码。所以两者都不能同时进行。
因此,在每次通话中单独使用它们对我来说似乎是最好的方法。