2012-08-02 50 views
2

這是我的第一篇文章,以便在此先感謝您的幫助:)可能通過for循環創建許多app.get express.js調用?

我試圖讓我main.js文件,使事情變得更容易我想要做這樣的事情:

var pages = { 
"/profile":{"page":"My Profile","loc":"./contentPages/profile"}, 
... 
... 
... 
}; 

for (var item in pages) { 
    app.get(item, function(req, res){ 
     if(req.session.user_id == null){ 
      res.redirect('/'); 
      return; 
     } 


     res.render(pages[item].loc, { 
     title:pages[item].page, 
     thisPage:pages[item].page 
     }); 
    }); 
} 

現在無論發生什麼事,我在字典中的最後一個東西都是始終呈現的頁面。有沒有辦法做這樣的事情,或者我必須寫出我想創建的每一頁?

非常感謝!

+0

使用'foreach'而不是'for'。 – 2012-08-03 01:42:50

回答

3

的問題是,由function(req, res)創建的所有封閉是指相同的變量(item),因此它們都使用任何值它時,他們叫,而不是什麼了的時候被創建,這將是最後一個。

最簡單的解決方法是使用一個輔助函數創建閉包:

function makeHandler(item) { 
    return function(req, res) { 
    // copy body of handler function here 
    }; 
} 

,然後用替換你的循環體:

app.get(item, makeHandler(item)); 

現在每個處理程序獲取它自己的私有副本item它始終保留它創建時的值。

您也可以使用立即函數調用來創建閉包,但這會使代碼看起來更加混亂。

+0

這很有道理,謝謝你的幫助! – gavman4 2012-08-10 00:02:42

+0

作爲一個前端人物,我的第一個問題是如何聲明item變量? – 2014-03-04 08:25:46