Яка різниця між "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 приходить на розум.


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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.