2013-01-15 83 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用於引起人們對潛在缺陷的關注。如果你瞭解他們,你可以繞過他們。