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

上記は、単純なケースでは問題ありません。

EJS が処理された文字列を関数の戻り値として返すようにするにはどうすればよいですか? 次のように機能させます。

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

言い換えれば、非同期ではなく、いくつかの render() 呼び出しをネスト/チェーンしたいのです。

Express はこれをネイティブにサポートしていないようですが、そうですか?
そうでない場合、どうすれば EJS を介して直接それを達成できますか?

なぜ私が「悪い」方法 (同期) を好むのか疑問に思われる場合は、1 つ言いたいことがあります。それは、キャッシュです。
とにかくテンプレートはキャッシュされているので、テンプレートの最初の読み込みが遅くなっても気にしません (とにかく数ミリ秒で)。
render() へのネストされた非同期呼び出しを処理する必要がある場合と比較して、時間の一部の 1 つの遅延のこのコストはコストではありません。

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 に答える