2013-06-05 47 views
2

使用在节点服务器上运行的快速应用程序,我将如何从完整路径递归搜索渲染文件,直至所提供的URL的开头。使用Express JS级联渲染使用Express JS

例如,如果有人用www.somewebsite.com/shop/products/product打我的服务器,渲染引擎会首先检查shop/products/product /中是否有index.jade文件。如果没有找到,它会检查商店/产品/,然后购物/。

var express = require('express'); 

var app = express(); 

app.get('/*', function(req, res){ 

    res.render(req.path + '/index.jade', function(err, html){ 

     // some loopback code which alters the path and recalls the render method  

    }) 
}); 

问题是响应对象没有传递给渲染回调,所以我无法回想起回应的渲染。我期待创建一个循环,因为URL路径可以是任意数量的目录,所以我不能假设我只需要级联一个确定的次数。

任何人都看到了这个方法?

回答

0

您应该能够使用闭包中的响应对象。我认为(假设明示允许您res.render第二次调用),你可以使用这样的代码答案达到你想要的东西:

var express = require('express'); 

var app = express(); 

app.get('/*', tryRender); 

function tryRender(req, res){ 

    res.render(req.path + '/index.jade', function(err, html){ 

     if (err) { 
      req.path = 'mynewpath'; 
      tryRender(req, res); 
     }  

    }) 
} 

注意:您将需要添加一个基本情况或此功能将如果找不到工作视图,则无限递归:D

如果express不允许后续调用res.render,那么您可能需要自行确定该文件是否存在于文件系统上。

+0

使用闭包将不起作用,因为回调将需要调用可变次数,具体取决于url的有多少部分。你的例子使用了我想避免的重定向。 – shennan

+0

只要express允许后续的'res.render'调用,该代码就可以工作。这个例子很快就能找到。只需将'res.redirect'替换为'res.render'。无论如何,我添加了一个我的意思的代码示例。如果express不允许您多次调用渲染,那么您可能必须对文件系统执行一些操作以检查视图是否存在。 –

+0

如果我理解你的意思,我认为我的递归函数应该处理闭包不工作的问题。请记住,您将需要一个基本案例或无限循环:D –