Подтвердить что ты не робот

Какая разница между "app.render" и "res.render" в express.js?

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

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

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

Отобразить представление с обратным вызовом, отвечая на визуализированную строку. При возникновении ошибки next(err) вызывается внутренне. При обратном вызове передаются как возможные ошибки, так и отображаемая строка, и автоматическая реакция не выполняется.

Может кто-нибудь, пожалуйста, помогите мне выяснить, когда использовать какой?

4b9b3361

Ответ 1

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

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

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

  • Вы можете использовать функции 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
    }
    

Ответ 2

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

Ответ 3

вместе с этими двумя вариантами также существует 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.