app.render
的文档:
使用呈现的字符串响应回调视图。这是
res.render()
的应用级变体,行为方式相同。
res.render
的文档:
使用呈现的字符串响应回调视图。发生错误时,会在内部调用
next(err)
。当提供回调时,传递可能的错误和呈现的字符串,并且不执行自动响应。
如何确定何时使用哪一个?
答案 0 :(得分:135)
以下是一些差异:
您可以在根级别上调用app.render
,仅在路由/中间件中调用res.render
。
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
res.render
在内部使用app.render
呈现模板文件。
您可以使用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
}
答案 1 :(得分:23)
在需要呈现视图但不通过http将其发送到客户端的场景中使用app.render
。想到html电子邮件。
答案 2 :(得分: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中可用作路由