2

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

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

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

非常感谢!

4

1 回答 1

3

问题是所有通过function(req, res)引用同一个变量(item)创建的闭包,所以它们都使用调用它们时的任何值,而不是创建它们时的值,这将是最后一个。

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

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

然后将循环体替换为:

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

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

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

于 2012-08-03T04:10:18.557 回答