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


Documentos para app.render:

Renderice una vista con una devolución de llamada respondiendo con la cadena procesada. Esta es la variante de nivel de aplicación de res.render(), y de lo contrario se comporta de la misma manera.

Documentos para res.render:

Renderice una vista con una devolución de llamada respondiendo con la cadena procesada. Cuando ocurre un error next(err) es invocado internamente Cuando se proporciona una devolución de llamada, se pasan el posible error y la cadena prestada, y no se realiza ninguna respuesta automática.

¿Alguien podría ayudarme a averiguar cuándo usar cuál?


75
2018-03-14 07:50


origen


Respuestas:


Aquí hay algunas diferencias:

  1. Puedes llamar app.render en nivel raíz y res.render solamente dentro de una ruta / middleware.

  2. app.render siempre devuelve el html  en la función de devolución de llamada, mientras que res.render lo hace solo cuando ha especificado la función de devolución de llamada como su tercer parámetro. Si llamas res.render sin la tercera función de parámetro / devolución de llamada, el html representado 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 el 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.render usos app.render internamente para renderizar archivos de plantilla.

  4. Puedes usar el render funciones para crear correos electrónicos html. Dependiendo de la estructura de su aplicación, es posible que no siempre tenga acceso a la app objeto.

    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
    }
    

129
2018-03-14 08:38



utilizar app.render en escenarios donde necesita renderizar una vista pero no enviarla a un cliente a través de http. html correos electrónicos a la mente.


21
2018-03-14 08:08



junto con estas dos variantes, también hay jade.renderFile que genera html que no necesita ser pasado 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 una ruta en app.js.


1
2018-06-18 10:03