82 votes

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

Docs pour app.render :

Rendre une vue avec un callback répondant avec la chaîne rendue. Il s'agit de la variante au niveau de l'application de res.render() et se comporte autrement de la même manière.

Docs pour res.render :

Rendre une vue avec un callback répondant avec la chaîne rendue. Lorsqu'une erreur se produit next(err) est invoquée en interne. Lorsqu'un rappel est fourni, l'erreur éventuelle et la chaîne rendue sont transmises, et aucune réponse automatique n'est effectuée.

Comment puis-je savoir quand utiliser l'un ou l'autre ?

147voto

zemirco Points 5419

Voici quelques différences :

  1. Vous pouvez appeler app.render en Niveau de la racine y res.render seulement à l'intérieur d'une route/middleware .

  2. app.render renvoie toujours le html dans la fonction de rappel alors que res.render ne le fait que si 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 html rendu est envoyé au client avec un code d'état de 200 .

    Jetez un coup d'œil aux 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="http://stackoverflow.com/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 un 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èles.

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

    Par exemple à l'intérieur d'une route 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
    }

0 votes

@zeMicro qu'en est-il cache mécanisme ? ?? Est-ce que app.render l'utilise aussi ?

0 votes

Comment obtenir la valeur de la clé de titre du côté client ? J'utilise un fichier HTML (ejs).

23voto

VeXii Points 1447

Utiliser app.render dans les scénarios où vous devez rendre une vue mais ne pas l'envoyer à un client via http. Les emails html me viennent à l'esprit.

1voto

Vinay Vemula Points 1881

En plus de ces deux variantes, il y a aussi jade.renderFile qui génère du html qui ne doit pas ê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 en tant que route dans app.js.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X