2013-01-15 54 views
0

请找我的node.js服务器代码片段如下:的JavaScript:摆脱3个JSHint错误

// Define the user API 
var API = { 
    list: 'private', 
    login: 'public', 
    logout: 'private', 
    add: 'admin', 
    remove: 'admin', 
    edit: 'admin' 
}; 

// Attach API handlers 
for(var label in API) { 
    var denied = 'Permission denied'; 

    var wrapper = (function (label) { 
     return function (req, res) { 
      var permission = API[label]; 

      if(!req.session) { 
       if(permission !== 'public') { 
        res.send(denied); 
        return; 
       } 
      } else if((permission === 'admin') && (req.session.rights !== 'Administrator')) { 
       res.send(denied); 
       return; 
      } 

      eval(label + '(req, res)'); 
     }; 
    }(label)); 

    server.post('/user/' + label, wrapper); 
} 

基本上,我对中API每个属性的API处理器,并以编程方式附加处理程序,酌情处理权限。然而JSHint真的不喜欢这个。我得到三个错误:

Line 29: eval(label + '(req, res)'); 
eval is evil. 

Line 31: }(label)); 
Don't make functions within a loop. 

Line 12: for(var label in API) { 
The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype. 

这段代码如何改进以使JSHint快乐?您会对代码提出其他更改吗?

+1

如果'label'是一个在全局范围内定义的函数,那么您可以执行'window [label](req,res);' –

+0

希望得到downvoter的评论。 – Randomblue

+0

'for的主体应该被包装在一个if语句中以从原型中过滤不需要的属性.'如果label是一个你设置的属性,或者如果它被继承了,那么你应该检查API.hasOwnProperty(label)原型链。 –

回答

2

我会建议通过使jslint不太严格的设置,并设置这些(只要你明白为什么)。 Jslint是非常严格的,这就是为什么它有选择使其不那么严格。重要的是,你知道他们为什么被标记,为什么你可以允许这些东西。

例如允许EVAL使用:

/*jslint evil: true */ 

一些用途:

/*jslint plusplus: true */ 

,因为他们发现,++和 - 使他们有错误的创建或可读性没有问题。

jslint用于引起人们对潜在缺陷的关注。如果你了解他们,你可以绕过他们。