What's the difference between "app.render" and "res.render" in express.js?
Here are some differences:
You can call
app.render
on root level andres.render
only inside a route/middleware.-
app.render
always returns thehtml
in the callback function, whereasres.render
does so only when you've specified the callback function as your third parameter. If you callres.render
without the third parameter/callback function the rendered html is sent to the client with a status code of200
.Take a look at the following examples.
-
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
without third parameterapp.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
with third parameterapp.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
usesapp.render
internally to render template files.-
You can use the
render
functions to create html emails. Depending on your structure of your app, you might not always have acces to theapp
object.For example inside an external route:
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 }
use app.render
in scenarios where you need to render a view but not send it to a client via http. html emails springs to mind.
along with these two variants, there is also jade.renderFile
which generates html that need not be passed to the 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()
is available as a route in app.js.