【发布时间】:2013-03-02 11:29:02
【问题描述】:
app.render 的文档:
渲染一个带有回调的视图,该回调响应渲染的字符串。这是
res.render()的应用级变体,其他方面的行为方式相同。
res.render 的文档:
渲染一个带有回调的视图,该回调响应渲染的字符串。发生错误时,会在内部调用
next(err)。当提供回调时,可能的错误和呈现的字符串都会被传递,并且不会执行自动响应。
我怎样才能确定何时使用哪一个?
【问题讨论】:
app.render 的文档:
渲染一个带有回调的视图,该回调响应渲染的字符串。这是
res.render()的应用级变体,其他方面的行为方式相同。
res.render 的文档:
渲染一个带有回调的视图,该回调响应渲染的字符串。发生错误时,会在内部调用
next(err)。当提供回调时,可能的错误和呈现的字符串都会被传递,并且不会执行自动响应。
我怎样才能确定何时使用哪一个?
【问题讨论】:
在需要渲染视图但不通过 http 将其发送到客户端的场景中使用 app.render。 html电子邮件浮现在脑海。
【讨论】:
这里有一些区别:
您可以在根级别调用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
}
【讨论】:
app.render也用了吗?
除了这两个变体之外,还有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 中可用作路由。
【讨论】: