2013-03-14 10 views
72

Docs dla app.render:Jaka jest różnica między "app.render" i "res.render" w pliku express.js?

wygenerować widok z zwrotna reaguje ze świadczonych ciąg. Jest to wersja na poziomie aplikacji res.render(), a poza tym zachowuje się w ten sam sposób.

Docs dla res.render:

wygenerować widok z zwrotna reaguje ze świadczonych ciąg. Gdy wystąpi błąd, wewnętrznie zostanie wywołana next(err). Po otrzymaniu wywołania zwrotnego przekazywany jest zarówno możliwy błąd, jak i renderowany ciąg znaków, i nie jest wykonywana automatyczna odpowiedź.

Czy ktoś mógłby pomóc mi dowiedzieć się, kiedy użyć?

Odpowiedz

20

użyć app.render w scenariuszach, w których trzeba renderować widok, ale nie można go wysłać do klienta za pośrednictwem protokołu http. e-maile z html przychodzą na myśl.

127

Oto kilka różnic:

  1. Można zadzwonić app.render na poziom korzeń i tylko res.renderwewnątrz trasy/middleware.

  2. app.render zawsze zwraca htmlw funkcji zwrotnej, natomiast res.render robi to tylko wtedy, gdy wcześniej określona funkcję oddzwonienia jak wasz trzeci parametr. Jeśli wywołasz res.render bez funkcji trzeciego parametru/wywołania zwrotnego, renderowany html jest wysyłany do klienta z kodem stanu 200.

    Spójrz na następujące przykłady.

    • 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 bez trzeciego parametru

      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 z trzeciego parametru

      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 wykorzystuje app.render wewnętrznie do renderowania plików szablonów.

  4. Można użyć funkcji render stworzyć html maile. W zależności od struktury Twojej aplikacji możesz nie zawsze mieć dostęp do obiektu app.

    na przykład wewnątrz drogi zewnętrznej:

    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 
    } 
    
+0

genialna odpowiedź. –

+0

@zeMicro co z ** mechanizmem cache **? Czy 'app.render' również to używa? – fider

+0

Jak uzyskać tytuł Wartość klucza po stronie klienta? Używam pliku HTML (ejs) –

1

wraz z tymi dwoma wariantami istnieje również jade.renderFile, który generuje html, który nie musi być przekazany klientowi.

usage-

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() dostępny jako trasie app.js.

Powiązane problemy