目录
res.render(view [, locals] [, callback])
在 Express 可以呈现模板文件之前,必须设置以下应用程序设置:
views
:模板文件所在目录。例如:app.set("views", path.join(__dirname, "views"));view engine
:要使用的模板引擎。例如:app.set("view engine", "jade");
将模板引擎用于 Express
然后安装对应的模板引擎 npm 包:
$ npm install jade
与 Express 兼容的模板引擎(例如 jade)导出名为 __express(filePath, options, callback)
的函数,该函数由 res.render()
函数调用以呈现模板代码。 某些模板引擎并不遵循此约定。Consolidate.js 库通过映射所有流行的 Node.js 模板引擎来遵循此约定,因此可以在 Express 内无缝工作。
在设置视图引擎之后,不必指定该引擎或者在应用程序中装入模板引擎模块;Express 在内部装入此模块,如下所示(针对以上示例)。
app.set("view engine", "jade");
在 views
目录中创建名为 layout.jade 的 jade 模板文件,其中包含以下内容:
doctype html
html
head
title= title
body
block content
在 views
目录中创建名为 error.jade 的 jade 模板文件,其中包含以下内容:
extends layout
block content
h1= message
h2= error.status
pre #{error.stack}
随后创建路由以呈现 error.jade 文件。如果未设置 view engine
属性,必须指定 view
文件的扩展名。否则,可以将其忽略。
//错误拦截器
app.use(function (err, req, res, next) {
// 设置通信信息开发环境渲染错误信息
res.locals.message = err.message;
res.locals.error = req.app.get("env") === "development" ? err : {};
// 设置状态码
res.status(err.status || 500);
//渲染的错误页
res.render("error");
});
向主页发出请求时,error.jade 文件将呈现为 HTML。
res.locals
使用此属性设置在使用 res.render 渲染的模板中可访问的变量。res.locals
上设置的变量在单个请求-响应周期内可用,并且不会在请求之间共享。
为了保留局部变量以用于请求之间的模板渲染,请改用 app.locals。
此属性对于向应用中渲染的模板公开请求级信息(例如请求路径名称、经过身份验证的用户、用户设置等)很有用。
app.use((req, res, next) => {
// Make `user` and `authenticated` available in templates
res.locals.user = req.user
res.locals.authenticated = !req.user.anonymous
next()
})
app.set(name, value)
将设置 name
分配给 value
。你可以存储任何你想要的值,但某些名称可用于配置服务器的行为。这些特殊名称列在 应用设置表 中。
为布尔属性调用 app.set('foo', true)
与调用 app.enable('foo')
相同。同样,为布尔属性调用 app.set('foo', false)
与调用 app.disable('foo')
相同。
使用 app.get() 检索设置的值。
app.set('title', 'My Site')
app.get('title') // "My Site"
res.render(view [, locals] [, callback])
渲染 view
并将渲染的 HTML 字符串发送到客户端。可选参数:
-
locals
,一个对象,其属性定义视图的局部变量。 -
callback
,回调函数。如果提供,该方法将返回可能的错误和渲染的字符串,但不执行自动响应。当发生错误时,该方法在内部调用next(err)
。
view
参数是一个字符串,它是要渲染的视图文件的文件路径。这可以是绝对路径,也可以是相对于 views
设置的路径。如果路径不包含文件扩展名,则 view engine
设置确定文件扩展名。如果路径确实包含文件扩展名,那么 Express 将加载指定模板引擎的模块(通过 require()
)并使用加载模块的 __express
函数渲染它。
有关详细信息,请参阅 使用 Express 模板引擎。
注意:view
参数执行文件系统操作,例如从磁盘读取文件和评估 Node.js 模块,因此出于安全原因不应包含来自终端用户的输入。
局部变量 cache
启用视图缓存。设置为 true
,用于在开发过程中缓存视图;默认情况下,在生产环境中启用视图缓存。
// send the rendered view to the client
res.render('index')
// if a callback is specified, the rendered HTML string has to be sent explicitly
res.render('index', (err, html) => {
res.send(html)
})
// pass a local variable to the view
res.render('user', { name: 'Tobi' }, (err, html) => {
// ...
})