¿Cuál es la diferencia entre "app.render" y "res.render" en express.js?

82

Documentos para app.render:

Renderice una vista con una devolución de llamada respondiendo con la cadena renderizada. Esta es la variante a nivel de aplicación de res.render()y, por lo demás, se comporta de la misma manera.

Documentos para res.render:

Renderice una vista con una devolución de llamada respondiendo con la cadena renderizada. Cuando ocurre un error, next(err)se invoca internamente. Cuando se proporciona una devolución de llamada, se pasan tanto el posible error como la cadena renderizada, y no se realiza una respuesta automática.

¿Cómo puedo saber cuándo usar cuál?

Evan Carroll
fuente

Respuestas:

146

A continuación se muestran algunas diferencias:

  1. Puede llamar app.rendera nivel raíz y res.rendersolo dentro de una ruta / middleware .

  2. app.rendersiempre devuelve el html en la función de devolución de llamada , mientras res.renderque lo hace solo cuando ha especificado la función de devolución de llamada como tercer parámetro. Si llama res.rendersin el tercer parámetro / función de devolución de llamada, el html renderizado se envía al cliente con un código de estado de 200.

    Eche un vistazo a los siguientes ejemplos.

    • 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 sin tercer parámetro

      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 tercer parámetro

      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.renderutiliza app.renderinternamente para representar archivos de plantilla.

  4. Puede utilizar las renderfunciones para crear correos electrónicos html . Dependiendo de la estructura de su aplicación, es posible que no siempre tenga acceso al appobjeto.

    Por ejemplo, dentro de una ruta externa:

    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
fuente
@zeMicro ¿qué pasa con el mecanismo de caché ? ¿Lo app.renderusa también?
fider
¿Cómo puedo obtener el valor de la clave del título en el lado del cliente? Estoy usando un archivo HTML (ejs)
Mangesh Sathe
23

utilícelo app.renderen escenarios en los que necesite representar una vista pero no enviarla a un cliente a través de http. Me viene a la mente el correo electrónico html.

VeXii
fuente
1

junto con estas dos variantes, también existe la jade.renderFileque genera html que no es necesario pasar al cliente.

uso-

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() está disponible como ruta en app.js.

Vinay Vemula
fuente