Jaka jest różnica między „app.render” a „res.render” w express.js?

82

Dokumenty dla app.render:

Renderuj widok z wywołaniem zwrotnym odpowiadającym wyświetlonym ciągiem. To jest wariant na poziomie aplikacji res.render(), a poza tym zachowuje się w ten sam sposób.

Dokumenty dla res.render:

Renderuj widok z wywołaniem zwrotnym odpowiadającym wyświetlonym ciągiem. Gdy wystąpi błąd, next(err)wywoływana jest wewnętrznie. Gdy zostanie podane wywołanie zwrotne, przekazywany jest zarówno możliwy błąd, jak i renderowany ciąg i nie jest wykonywana żadna automatyczna odpowiedź.

Jak mogę się dowiedzieć, kiedy użyć którego?

Evan Carroll
źródło

Odpowiedzi:

146

Oto kilka różnic:

  1. Możesz wywoływać app.renderna poziomie głównym i res.rendertylko wewnątrz trasy / oprogramowania pośredniego .

  2. app.renderzawsze zwraca the html w funkcji callback , podczas gdy res.renderrobi to tylko wtedy, gdy określisz funkcję callback jako trzeci parametr. W przypadku wywołania res.renderbez trzeciego parametru / funkcji zwrotnej renderowany kod HTML jest wysyłany do klienta z kodem stanu 200.

    Spójrz na poniższe 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 trzecim parametrem

      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.renderużywa app.renderwewnętrznie do renderowania plików szablonów.

  4. Możesz użyć renderfunkcji do tworzenia wiadomości e-mail w formacie HTML . W zależności od struktury Twojej aplikacji możesz nie zawsze mieć dostęp do appobiektu.

    Na przykład wewnątrz trasy 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
    }
    
zemirco
źródło
@zeMicro a co z mechanizmem pamięci podręcznej ? Czy app.renderto też używa?
fider
Jak uzyskać kluczową wartość tytułu po stronie klienta? Używam pliku HTML (ejs)
Sathe
23

używaj app.renderw scenariuszach, w których musisz renderować widok, ale nie wysyłać go do klienta przez http. na myśl przychodzą e-maile w formacie html.

VeXii
źródło
1

wraz z tymi dwoma wariantami istnieje również, jade.renderFilektóry generuje html, którego nie trzeba przekazywać klientowi.

stosowanie-

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() jest dostępna jako trasa w app.js.

Vinay Vemula
źródło