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

$ 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下呈现任何文件,因为其中会有一些。我考虑改用静态目录,但是看起来静态文件不会通过玉器中间件。

最佳答案

参数不能包含/。评估后,URL由/标记以获取参数。

当您执行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/之后的所有内容,因此您可以正确呈现路径。因此,您甚至可以在其中创建子目录

关于node.js - 无论路径深度如何,如何使Express渲染一个目录中的任何 Jade 文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17076360/

10-12 13:21