web-dev-qa-db-fra.com

Quelle est la différence entre "app.render" et "res.render" dans express.js?

Docs for app.render :

Rendre une vue avec un rappel répondant avec la chaîne rendue. Ceci est la variante au niveau de l'application de res.render(), et se comporte sinon de la même manière.

Docs for res.render :

Rendre une vue avec un rappel répondant avec la chaîne rendue. Lorsqu'une erreur survient, next(err) est appelé en interne. Lorsqu'un rappel est fourni, l'erreur possible et la chaîne rendue sont transmises et aucune réponse automatisée n'est exécutée.

Comment puis-je savoir quand utiliser lequel?

78
Evan Carroll

Voici quelques différences:

  1. Tu peux appeler app.render on niveau racine et res.render seulement _ dans un itinéraire/middleware.

  2. app.render _ renvoie toujours le html dans la fonction de rappel, alors que res.render ne le fait que lorsque vous avez spécifié la fonction de rappel comme troisième paramètre. Si vous appelez res.render sans le troisième paramètre/fonction de rappel, le code HTML rendu est envoyé au client avec un code de statut de 200.

    Regardez les exemples suivants.

    • 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 sans troisième paramètre

      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 avec le troisième paramètre

      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 utilise app.render en interne pour rendre les fichiers de modèle.

  4. Vous pouvez utiliser les fonctions render pour créer html emails. Selon la structure de votre application, il se peut que vous n'ayez pas toujours accès à l'objet app.

    Par exemple, dans un itinéraire externe:

    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
    }
    
138
zemirco

utilisation app.render dans les scénarios dans lesquels vous devez rendre une vue sans l'envoyer à un client via http. Les emails en HTML me viennent à l'esprit.

23
VeXii

en plus de ces deux variantes, il existe également jade.renderFile qui génère du code HTML qui n'a pas besoin d'être transmis au client.

usage-

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 sous forme de route dans app.js.

1
Vinay Vemula