如何在一个目录中快速渲染任何jade文件,无论路径深度如何?

时间:2013-06-12 22:18:56

标签: node.js express url-routing

我有一个应用程序,其视图位于以下目录中:

$ ftree ./web/views
| |____views
| | |____index.jade
| | |____404.jade
| | |____partials
| | | |____test.index.jade
| | | |____index.jade
| | | |____test
| | | | |____index.jade **** 
| | |____layout.jade
| | |____500.jade

当我致电/views/partials/test/index.jade时,我希望能够在/partials/test/index.jade呈现视图。我的路线设置如下:

exports.partials = (req, res)->
  filename = req.params.filename
  return unless filename # might want to change this
  console.log "rendering partial at #{filename}"
  res.render "partials/#{filename}"

app.configure(->
  app.set('port', process.env.PORT || 3001)
  app.set('views', __dirname + '/views')
  app.set('view engine', 'jade')
...
app.get('/partials/:filename', routes.partials)

这一切都适用于partials/index.jadepartials/test.index.jade,但partials/test/index.jade失败(404)。

我是否必须为/partials的每个子目录制作路线?我想表达要在/partials下呈现任何文件,因为会有一些文件。我考虑使用静态目录,但看起来静态文件不会通过jade处理器中间件。

1 个答案:

答案 0 :(得分:2)

params不能包含/。评估后,/将对网址进行标记,以获得参数。

执行app.get('/partials/:filename', routes.partials)时,它匹配partials / index.jade,因为req.params.filename设置为index.jade(只有一个有效的参数)。但它与partials/test/index.jade不匹配,因为需要匹配两个参数。

要达到你想要的效果,你可以做到这一点

app.get('/partials/*', routes.partials)

并在路线中执行:

exports.partials = (req, res)->
  filename = req.params
  return unless filename # might want to change this
  console.log "rendering partial at #{filename}"
  res.render "partials/#{filename}"

在上面的代码req.params中匹配/partials/之后的所有内容,因此您可以正确呈现路径。所以你甚至可以在其中创建子目录