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?
Voici quelques différences:
Tu peux appeler app.render
on niveau racine et res.render
seulement _ dans un itinéraire/middleware.
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
res.render
utilise app.render
en interne pour rendre les fichiers de modèle.
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
}
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.
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.