2012-08-02 28 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