这是我的第一篇文章,所以提前感谢您的帮助:)
我正在尝试制作我的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 :(得分:3)
问题在于function(req, res)
创建的所有闭包都引用了相同的变量(item
),因此它们都会使用它们调用时所具有的值而不是它所具有的值。他们被创造出来了,这将是最后一个。
最直接的解决方法是使用辅助函数创建闭包:
function makeHandler(item) {
return function(req, res) {
// copy body of handler function here
};
}
然后用:
替换循环体app.get(item, makeHandler(item));
现在每个处理程序都有自己的item
私有副本,它始终保留创建它时的值。
您也可以使用立即函数调用来创建闭包,但这会使代码看起来更混乱。