2013-06-05 77 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 –