[英]Assigning middlewares to specific actions in ActionHero
无论如何,是否要在特定操作中添加一些中间件? 因为据我所知,addPreProcessor将中间件添加到所有操作中? 假设您不想对某些操作进行身份验证或其他检查,是否有解决方案?
我有一个短期解决方案,但是如果您在定义操作时可以分配特定的中间件(例如,按顺序给出需要运行的一系列中间件名称),那就太好了。
我当前的解决方案是保留将中间件应用于它们的所有操作的数组,然后根据connection.aciton对其进行检查,但是仍然每个请求都通过所有中间件,然后传递给它对我来说听起来没效率!
exports.middlewares = function(api, next){
var myImportantMiddleware = function(connection, actionTemplate, next) {
var actionsToBeChecked = ['deposit'];
var action = connection.action;
if(actionsToBeChecked.indexOf(action) > -1) {
/* middleware logic
next(connection, true); */
} else {
next(connection, true);
}
}
api.actions.addPreProcessor(myImportantMiddleware);
next();
}
提前致谢 !
不需要做所有的事情! 从文档中查看以下示例: https : //github.com/evantahler/actionhero-tutorial/blob/master/initializers/middleware.js
exports.middleware = function(api, next){
var authenticationMiddleware = function(connection, actionTemplate, next){
if(actionTemplate.authenticated === true){ // <-- HERE
api.users.authenticate(connection.params.userName, connection.params.password, function(error, match){
if(match === true){
next(connection, true);
}else{
connection.error = "Authentication Failed. userName and password required";
next(connection, false);
}
});
}else{
next(connection, true);
}
}
api.actions.addPreProcessor(authenticationMiddleware);
next();
}
是的,所有中间件都会触发所有动作,但是您可以告诉中间件检查动作的定义,并查找特定的属性。 在这种情况下,我们只关心动作是否如下所示:
exports.randomNumber = {
name: 'randomNumber',
description: 'I am an API method which will generate a random number',
outputExample: {
randomNumber: 0.123
},
authenticated: true // <<--- HERE
run: function(api, connection, next){
connection.response.randomNumber = Math.random();
next(connection, true);
}
};
好的,我想我找到了一个更好的解决方案,我想知道您的意见。
所以我只是在操作中添加了middlewares : ['middlewareOne', 'middlewareTwo']
,其执行顺序等于数组中中间件名称的顺序,然后我的中间件初始化程序是这样的
var async = require('async');
exports.middlewares = function(api, next){
var middlewares = {
authMiddleware : function(connection, next){
/* Middleware logic */
},
premiumAccessMiddleware : function(connection, next){
/* Middleware logic */
},
adminAccessMiddleware : function(connection, next){
/* Middleware logic */
}
};
var middlewareProcessor = function(connection, actionTemplate, next){
var actionMiddlewares = actionTemplate.middlewares;
async.eachSeries(actionMiddlewares, function(middlewareName, callback){
var middleware = api.middlewares[middlewareName];
if(!middleware) throw (new Error("Middleware '"+ middlewareName +"'doesn't exist")); /* In case I had a typo */
middleware(connection, function(new_connection, toRender){
connection = new_connection;
if(toRender){
callback();
}else{
callback('YOU SHALL NOT PASS');
}
});
}, function(err){
// if(err) return next(connection, false); // see EDIT1
next(connection, true);
});
}
api.actions.addPreProcessor(middlewareProcessor);
next();
}
有什么想法吗?
EDIT1: next(connection, false);
不要将任何内容发送给用户,我猜您始终希望向用户发送错误响应或某些内容,即使执行中间件在其中一个失败之后停止并返回了next(connection, false)
。 在这种情况下,在eachSeries最终回调函数中,我想我们总是必须使用next(connection, true);
;。 !
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.