我已经与Meteor玩了一段时间,现在已经使用Meteor.methods({...})
现在,如果用户已登录,我将检查每个方法的开头。是否可以将此代码编写为更加面向方面,并在另一个更集中的位置进行检查?与使用Meteor.Collection
检查.allow
的方式类似?我希望用户登录大多数方法,如果不是全部的话。
服务器上是否有一些执行管道,我可以插入函数来执行此操作?
答案 0 :(得分:1)
我想做一段时间这样的事情。
这是我到目前为止所做的:
// function to wrap methods with the provided preHooks / postHooks. Should correctly cascade the right value for `this`
function wrapMethods(preHooks, postHooks, methods){
var wrappedMethods = {};
// use `map` to loop, so that each iteration has a different context
_.map(methods, function(method, methodName){
wrappedMethods[methodName] = makeFunction(method.length, function(){
var _i, _I, returnValue;
for (_i = 0, _I = preHooks.length; _i < _I; _i++){
preHooks.apply(this, arguments);
}
returnValue = method.apply(this, arguments);
for (_i = 0, _I = postHooks.length; _i < _I; _i++){
postHooks.apply(this, arguments);
}
return returnValue;
});
});
return wrappedMethods;
}
// Meteor looks at each methods `.length` property (the number of arguments), no decent way to cheat it... so just generate a function with the required length
function makeFunction(length, fn){
switch(length){
case 0:
return function(){ return fn.apply(this, arguments); };
case 1:
return function(a){ return fn.apply(this, arguments); };
case 2:
return function(a, b){ return fn.apply(this, arguments); };
case 3:
return function(a, b, c){ return fn.apply(this, arguments); };
case 4:
return function(a, b, c, d){ return fn.apply(this, arguments); };
// repeat this structure until you produce functions with the required length.
default:
throw new Error("Failed to make function with desired length: " + length)
}
}
如果您想将其放入单独的文件/包中,则需要将function wrapMethods(...){...}
更改为wrapMethods = function(...){...}
示例用法,在方法调用之前检查用户是否有效:
function checkUser(){
check(this.userId, String);
}
Meteor.methods(wrapMethods([checkUser], [], {
"privilegedMethod": function(a, b, c){
return true;
}
}));