2013-03-14 17 views
72

Documenti per app.render:Qual è la differenza tra "app.render" e "res.render" in express.js?

Render una vista con un callback risponde con la stringa rendering. Questa è la variante a livello di app di res.render() e si comporta diversamente allo stesso modo.

Documenti per res.render:

Render una vista con un callback risponde con la stringa rendering. Quando si verifica un errore, next(err) viene richiamato internamente. Quando viene fornito un callback, vengono passati sia l'errore possibile che la stringa renderizzata e non viene eseguita alcuna risposta automatica.

Qualcuno potrebbe aiutarmi a capire quando usare quale?

risposta

20

utilizzare app.render in scenari in cui è necessario eseguire il rendering di una vista ma non inviarlo a un client tramite http. e-mail HTML in primo piano.

127

Qui sono alcune differenze:

  1. È possibile chiamare app.render su livello principale e solo res.renderall'interno di un percorso/middleware.

  2. app.render restituisce sempre il htmlnella funzione di callback, mentre res.render lo fa solo quando hai specificato la funzione di callback come terzo parametro. Se si chiama res.render senza la terza funzione parametro/callback, l'html reso viene inviato al client con un codice di stato 200.

    Dai uno sguardo ai seguenti esempi.

    • 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 senza terzo parametro

      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 con terzo parametro

      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 utilizza app.render internamente per rendere i file modello.

  4. È possibile utilizzare le funzioni render per creare e-mail html. A seconda della struttura della tua app, potresti non avere sempre accesso all'oggetto app.

    Ad esempio all'interno di un percorso esterno:

    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

risposta brillante. –

+0

@zeMicro E il meccanismo ** cache ** ?? Anche 'app.render' lo usa? – fider

+0

Come si può ottenere il valore chiave del titolo sul lato client? Sto usando il file HTML (ejs) –

1

insieme a queste due varianti, c'è anche jade.renderFile che genera html che non è necessario passare al client.

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() è disponibile come un percorso in app.js.

Problemi correlati