В чем разница между app.render и res.render в express.js?

82

Документы для app.render:

Визуализируйте представление с обратным вызовом, отвечающим отображаемой строкой. Это вариант на уровне приложения res.render(), и в остальном он ведет себя так же.

Документы для res.render:

Визуализируйте представление с обратным вызовом, отвечающим отображаемой строкой. При возникновении ошибки next(err)вызывается внутренне. Когда предоставляется обратный вызов, передаются и возможная ошибка, и отображаемая строка, и автоматический ответ не выполняется.

Как я могу определить, когда использовать какой?

Эван Кэрролл
источник

Ответы:

146

Вот некоторые отличия:

  1. Вы можете вызывать app.renderна корневом уровне и res.renderтолько внутри маршрута / промежуточного программного обеспечения .

  2. app.renderвсегда возвращает html в функции обратного вызова , тогда как res.renderделает это только тогда, когда вы указали функцию обратного вызова в качестве третьего параметра. Если вы вызываете res.renderбез третьего параметра / функции обратного вызова, визуализированный HTML-код отправляется клиенту с кодом состояния200 .

    Взгляните на следующие примеры.

    • 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 без третьего параметра

      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 с третьим параметром

      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используется app.renderвнутри для визуализации файлов шаблонов.

  4. Вы можете использовать эти renderфункции для создания электронных писем в формате HTML . В зависимости от вашей структуры приложения у вас может не всегда быть доступ к appобъекту.

    Например, внутри внешнего маршрута:

    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
    }
    
Земирко
источник
@zeMicro как насчет механизма кеширования ?? Это app.renderтоже использует?
fider
Как получить значение ключа заголовка на стороне клиента? Я использую файл HTML (ejs)
Мангеш Сате
23

используйте app.renderв сценариях, где вам нужно визуализировать представление, но не отправлять его клиенту через http. На ум приходят электронные письма в формате html.

VeXii
источник
1

Наряду с этими двумя вариантами существует также jade.renderFileгенерирующий HTML-код, который не нужно передавать клиенту.

Применение-

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() доступен как маршрут в app.js.

Винай Вемула
источник