可以使用express.js通过for循环创建许多app.get调用吗?

时间:2012-08-02 23:48:18

标签: node.js express

这是我的第一篇文章,所以提前感谢您的帮助:)

我正在尝试制作我的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
        });
    });
}

现在无论发生什么事情,无论我在字典中的最后一个是总是呈现的页面。有没有办法做这样的事情,还是我必须写出我想创建的每一页?

非常感谢!

1 个答案:

答案 0 :(得分:3)

问题在于function(req, res)创建的所有闭包都引用了相同的变量(item),因此它们都会使用它们调用时所具有的值而不是它所具有的值。他们被创造出来了,这将是最后一个。

最直接的解决方法是使用辅助函数创建闭包:

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

然后用:

替换循环体
app.get(item, makeHandler(item));

现在每个处理程序都有自己的item私有副本,它始终保留创建它时的值。

您也可以使用立即函数调用来创建闭包,但这会使代码看起来更混乱。