res.render("index.ejs", {});
以上情况适用于简单案件。
如何让EJS将处理后的字符串作为函数的返回值返回? 让它像这样工作:
res.send(ejs.render("index.ejs", {}));
换句话说 - 我想嵌套/链接一些render()调用,而不是异步。
Express本身似乎不支持这种做法,或者它是否支持? 如果没有,那么我将如何直接通过EJS实现它?
如果你想知道我为什么喜欢“糟糕”的方式(同步)那么我有一点要说:缓存。
无论如何模板都被缓存了,所以我不介意模板的第一次加载要慢一些(反正只需几毫秒)。
与必须处理对render()的嵌套异步调用相比,时间分数的单个延迟成本是免费的。
答案 0 :(得分:1)
您可以将回调传递给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);
});