【问题标题】:express, jade, node.js, coffeescript, setting up routes using an array of variables and a for loopexpress、jade、node.js、coffeescript,使用变量数组和 for 循环设置路由
【发布时间】:2012-06-18 14:25:52
【问题描述】:

我刚刚继承了一个用coffeescript编写的node.js/express项目,并使用jade来渲染视图。在我的视图文件夹中,我有大约 20 个需要设置路由的玉文件。而不是像这样一遍又一遍地重复自己(目前工作得很好):

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}",

很遗憾,这不起作用。有什么建议吗?

【问题讨论】:

  • 究竟是什么不工作,你有什么错误吗?

标签: node.js coffeescript express pug


【解决方案1】:

快速响应:

for url in urls
  app.get "/html/#{url}.html", (req,res) ->
    res.render req.params.url

【讨论】:

  • 感谢您的快速响应,但这似乎不起作用:(
  • Arnaud,您将 CoffeeScript 的字符串插值与 Express 的参数插值混淆了,类似于 "/html/:url"
【解决方案2】:

这是一个典型的问题,当您在 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 参数是一个更优雅的解决方案。如果您可以完全避免循环,请这样做!)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多