2014-03-19 154 views
2

我已经打了有流星一段时间,现在已经发布到客户端Meteor.methods({...})只允许在用户登录

现在我检查的一些服务器的方法来运行流星服务器的方法每个方法的开始,如果用户登录。是否有可能更多的面向方面编写代码,并检查另一个更集中的地方?类似Meteor.Collection.allow检查的方式?我希望用户能够登录大多数的方法,如果不是全部的话。

服务器上可能有一些执行管道,我可以插入函数来执行此操作吗?

回答

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; 
    } 
}));