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?

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
    }
    

@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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.