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

对于简单的情况,上述内容会很好。

如何让 EJS 将处理后的字符串作为函数的返回值返回?让它像这样工作:

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

换句话说 -我想嵌套/链接一些 render() 调用,而不是异步的。

Express 似乎本身并不支持这一点,或者是吗?
如果没有,那么我将如何直接通过 EJS 实现它?

如果您想知道为什么我更喜欢“坏”方式(同步),那么我要说一件事:缓存。
无论如何,模板都被缓存了,所以我不介意模板的第一次加载速度变慢(无论如何只需几毫秒)。
与必须处理对 render() 的嵌套异步调用相比,这种时间分数的单次延迟成本是没有成本的。

4

1 回答 1

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
    });
  });
});

如果您不喜欢嵌套回调,我建议您查看一个异步库,例如 aptly names 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);
});
于 2012-10-06T16:17:58.660 回答