Was ist der Unterschied zwischen "app.render" und "res.render" in express.js?

82

Dokumente für app.render:

Rendern Sie eine Ansicht mit einem Rückruf, der mit der gerenderten Zeichenfolge antwortet. Dies ist die App-Level-Variante von res.render()und verhält sich ansonsten genauso.

Dokumente für res.render:

Rendern Sie eine Ansicht mit einem Rückruf, der mit der gerenderten Zeichenfolge antwortet. Wenn ein Fehler auftritt, next(err)wird er intern aufgerufen. Wenn ein Rückruf bereitgestellt wird, werden sowohl der mögliche Fehler als auch die gerenderte Zeichenfolge übergeben, und es wird keine automatische Antwort ausgeführt.

Wie kann ich herausfinden, wann ich welches verwenden soll?

Evan Carroll
quelle

Antworten:

146

Hier sind einige Unterschiede:

  1. Sie können app.renderauf Root-Ebene und res.rendernur innerhalb einer Route / Middleware aufrufen .

  2. app.renderGibt immer html die Rückruffunktion zurück , während res.renderdies nur dann der Fall ist, wenn Sie die Rückruffunktion als dritten Parameter angegeben haben. Wenn Sie res.renderohne die dritte Parameter- / Rückruffunktion aufrufen, wird das gerenderte HTML mit dem Statuscode von an den Client gesendet 200.

    Schauen Sie sich die folgenden Beispiele an.

    • 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="https://stackoverflow.com/stylesheets/style.css"></head><body><h1>res vs app render</h1><p>Welcome to res vs app render</p></body></html>
      
    • res.render ohne dritten Parameter

      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 mit drittem Parameter

      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.renderwird app.renderintern zum Rendern von Vorlagendateien verwendet.

  4. Mit den renderFunktionen können Sie HTML-E-Mails erstellen . Abhängig von Ihrer Struktur Ihrer App haben Sie möglicherweise nicht immer Zugriff auf das appObjekt.

    Zum Beispiel innerhalb einer externen Route:

    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
    }
    
Zemirco
quelle
@zeMicro was ist mit Cache- Mechanismus? Ist app.renderVerwendungen es auch?
Fider
Wie kann der Titel Schlüsselwert auf der Client-Seite erhalten? Ich benutze HTML-Datei (ejs)
Mangesh Sathe
23

Verwenden app.renderSie diese Option in Szenarien, in denen Sie eine Ansicht rendern, aber nicht über http an einen Client senden müssen. HTML-E-Mails fallen mir ein.

VeXii
quelle
1

Neben diesen beiden Varianten gibt es auch jade.renderFileHTML, das nicht an den Client übergeben werden muss.

Verwendung-

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() ist als Route in app.js verfügbar.

Vinay Vemula
quelle