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


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 intern aufgerufen. Wenn ein Rückruf bereitgestellt wird, werden sowohl der mögliche Fehler als auch die wiedergegebene Zeichenfolge übergeben, und es wird keine automatische Antwort ausgeführt.

Könnte mir bitte jemand helfen, herauszufinden, wann ich welche verwenden soll?


75
2018-03-14 07:50


Ursprung


Antworten:


Hier sind einige Unterschiede:

  1. Du kannst anrufen app.render auf Root-Ebene und res.render nur innerhalb einer Route / Middleware.

  2. app.render gibt immer das zurück html  in der Rückruffunktion, wohingegen res.render Dies ist nur möglich, wenn Sie die Callback-Funktion als dritten Parameter angegeben haben. Wenn du anrufst res.render Ohne den dritten Parameter / Callback-Funktion wird der gerenderte HTML-Code an den Client mit einem Statuscode von 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="/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.render Verwendet app.render intern zum Rendern von Vorlagendateien.

  4. Du kannst den ... benutzen render Funktionen zum Erstellen HTML-E-Mails. Abhängig von Ihrer Struktur Ihrer App haben Sie möglicherweise nicht immer Zugriff auf die app Objekt.

    Zum Beispiel in 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
    }
    

129
2018-03-14 08:38



benutzen app.render In Szenarien, in denen Sie eine Ansicht rendern, aber nicht über http an einen Client senden müssen. HTML-E-Mails fallen mir in den Sinn.


21
2018-03-14 08:08



zusammen mit diesen beiden Varianten gibt es auch jade.renderFile Das generiert HTML, 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


1
2018-06-18 10:03