express.jsの「app.render」と「res.render」の違いは何ですか?


82

のドキュメントapp.render

レンダリングされた文字列で応答するコールバックを使用してビューをレンダリングします。これはのアプリレベルのバリアントでres.render()あり、それ以外は同じように動作します。

のドキュメントres.render

レンダリングされた文字列で応答するコールバックを使用してビューをレンダリングします。エラーが発生するnext(err)と、内部で呼び出されます。コールバックが提供されると、発生する可能性のあるエラーとレンダリングされた文字列の両方が渡され、自動応答は実行されません。

どのタイミングをいつ使用するかをどのように判断できますか?

回答:


146

ここにいくつかの違いがあります:

  1. あなたは呼び出すことができますapp.render上のルート・レベルres.renderのみルート/ミドルウェアの内側

  2. app.render常にhtml コールバック関数でを返しますが、res.render3番目のパラメーターとしてコールバック関数を指定した場合にのみ返します。res.render3番目のパラメータ/コールバック関数なしで呼び出すと、レンダリングされたhtmlがステータスコード200。でクライアントに送信されます。

    次の例を見てください。

    • app.render

      app.render('index', {title: 'res vs app render'}, function(err, html) {
          console.log(html)
      });
      
      // logs the following string (from default index.jade)
      <!DOCTYPE html><html><head><title>res vs app render</title><link rel="stylesheet" href="/stylesheets/style.css"></head><body><h1>res vs app render</h1><p>Welcome to res vs app render</p></body></html>
      
    • res.render 3番目のパラメーターなし

      app.get('/render', function(req, res) {
          res.render('index', {title: 'res vs app render'})
      })
      
      // also renders index.jade but sends it to the client 
      // with status 200 and content-type text/html on GET /render
      
    • res.render 3番目のパラメータ付き

      app.get('/render', function(req, res) {
          res.render('index', {title: 'res vs app render'}, function(err, html) {
              console.log(html);
              res.send('done');
          })
      })
      
      // logs the same as app.render and sends "done" to the client instead 
      // of the content of index.jade
      
  3. res.renderapp.render内部でテンプレートファイルをレンダリングするために使用します。

  4. render関数を使用して、HTMLメールを作成できます。アプリの構造によっては、appオブジェクトに常にアクセスできるとは限りません。

    たとえば、外部ルート内:

    app.js

    var routes = require('routes');
    
    app.get('/mail', function(req, res) {
        // app object is available -> app.render
    })
    
    app.get('/sendmail', routes.sendmail);
    

    routes.js

    exports.sendmail = function(req, res) {
        // can't use app.render -> therefore res.render
    }
    

@zeMicroキャッシュメカニズムはどうですか?ですがapp.render、あまりにもそれを使用していますか?
ファイダー2014年

クライアント側でタイトルキー値を取得するにはどうすればよいですか?HTMLファイル(ejs)を使用しています
Mangesh Sathe 2015年

23

app.renderビューをレンダリングする必要があるが、http経由でクライアントに送信しないシナリオで使用します。htmlメールが頭に浮かぶ。


1

これらの2つのバリアントに加えjade.renderFileて、クライアントに渡す必要のないhtmlを生成するものもあります。

使用法-

var jade = require('jade');

exports.getJson = getJson;

function getJson(req, res) {
    var html = jade.renderFile('views/test.jade', {some:'json'});
    res.send({message: 'i sent json'});
}

getJson() app.jsでルートとして利用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.