我刚刚继承了一个项目,其中node.js / express用coffeescript编写,并使用jade来呈现视图。在我的views文件夹中,我有大约20个需要设置路由的jade文件。而不是一遍又一遍地重复自己(目前工作正常):
app.get '/html/404.html', (req,res) ->
res.render '404',
app.get '/html/503.html', (req,res) ->
res.render '503',
app.get '/html/foo.html', (req,res) ->
res.render 'foo',
我宁愿通过创建一个url数组并使用for循环来迭代它来保持这个不那么混乱,如下所示:
urls = [
"404"
"503"
"foo"
]
for url in urls
app.get "/html/#{url}.html", (req,res) ->
res.render "#{url}",
不幸的是,这不起作用。有什么建议吗?
答案 0 :(得分:3)
这是在JavaScript中在循环中定义闭包时发生的经典问题:您期望路由函数中url
的值与定义该函数时的值相同,但事实上,它就是循环中的最后一个值。毕竟,只有一个url
变量。
修复是在外部闭包中“捕获”该变量,这就是CoffeeScript具有do
语法的原因:
for url in urls
do (url) ->
app.get "/html/#{url}.html", (req,res) ->
res.render "#{url}"
有关详情,请参阅我的PragPub文章A CoffeeScript Intervention。
(话虽如此,Arnaud建议在路线中使用Express param是一个更优雅的解决方案。如果你可以完全避免循环,那就这样做!)
答案 1 :(得分:1)
快速回复:
for url in urls
app.get "/html/#{url}.html", (req,res) ->
res.render req.params.url