2012-10-06 95 views
2
res.render("index.ejs", {}); 

對於簡單的情況,以上情況都可以。nodejs/express/ejs render()同步

如何讓EJS返回處理的字符串作爲函數的返回值? 使它像這樣的工作:

res.send(ejs.render("index.ejs", {})); 

換句話說 - 我想窩/鏈一些渲染()調用,不是異步。

Express似乎並不支持這個本身,或者它呢?
如果不是,那麼我將如何直接通過EJS實現它?

如果你想知道爲什麼我更喜歡「壞」的方式(同步),那麼我有一件事要說:緩存。
無論如何,模板都被緩存了,所以我不介意模板的第一次加載速度會變慢(反正在幾個毫秒內)。
與必須處理對render()的嵌套異步調用相比,此時間分數的單個延遲的代價是沒有代價的。

回答

2

您只需將回調傳遞給res.render即可使用呈現的字符串調用。這將做async這是正確的方法來解決這個問題,因爲渲染可能需要讀取文件。

app.get('/', function(req, res){ 
    res.render('index', { title: 'Title' }, function(err, result) { 
    res.render('index2', {foo: 'data'}, function (err, result2) { 
     console.log('Render result:'); 
     console.log(result2); 
     res.send(result2); // send rendered HTML back to client 
    }); 
    }); 
}); 

如果你不喜歡嵌套的回調,我建議在尋找一個異步庫一樣貼切的名字async。您可以使用瀑布(https://github.com/caolan/async#waterfall)函數來做到這一點:

async.waterfall([ 
    function(done) { 
    res.render('index', {title: 'Title'}, done); 
    }, 

    function(result, done) { // result is the result of the first render 
    res.render(result, {foo: 'data'}, done); 
    } 
], function (err, result) { // result is the result of the second render 
    console.log(result); 
    res.send(result); 
}); 
+0

我明確要求它是同步的。我意識到這些影響。請理解,在我的情況下,我需要渲染()一個將渲染()另一個文件的文件。所以它嵌套在不同的文件中,而不是你的解決方案所建議的功能。不過謝謝。 – Poni

+0

如果你真的想同步,那麼你需要編寫你自己的渲染功能。 'express'中的渲染函數需要使用回調函數。 – Bill

+0

嘿嘿我知道這些了!希望有人會想出一個解決方案。無論如何,已經連線我自己的功能。 – Poni