express,jade,node.js,coffeescript,使用变量数组和for循环设置路由

时间:2012-06-15 13:53:33

标签: node.js coffeescript express pug

我刚刚继承了一个项目,其中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}",

不幸的是,这不起作用。有什么建议吗?

2 个答案:

答案 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