Node.js之Express三

    端午节3天说没就没了,自己的脚伤都快一个月了还没好,原本想着去桂林或者厦门呢,可计划赶不上变化,看自己公司C#软件工程师的招聘条件有要求MongoDb,年前就打算自己学习下,买的这本书就叫Node.js+MongoDB+AngularJs Web开发。自己也大致看了下,和SQL Server差不多,可能一些名词定义等不一样,但Node.js还剩Express这块没学完,所以还是先把Express学完了再学MongoDb吧。

一、Express模板引擎介绍

   今天看了下Express实现模板引擎部分,模板大家都很常见,在asp.net中也有模板,例如GridView中的模板、页面模板等,模板体现了复用的思想。在Express中也有模板。Express常见的模板引擎主要有两种:Jade和内嵌的Javascript(EJS).下面是它们两个的区别:

Jade使用HTML的速记符号模板,看上去并不像HTML,但模板文件非常小,易于掌握,缺点是需要学习另一种语言

EJS使用特殊的符号在正常的HTML文档中嵌入Javascript,这更容易从正常的HTML过渡,不足之处是HTML文档比原始文档要复杂得多。

二、模板引擎的使用

1.安装jade和ejs模块

npm install jade  npm install ejs

2.定义模板引擎

1)、定义模板引擎第一步是为Express定义一个默认的模板引擎。可以通过express()应用程序对象上对View Engine设定进行设置。

2)、把views设定位置为你的模板文件被存放的位置。

3)、为自己希望使用app.engine(ext,callback)方法来处理的模板扩展名注册模板引擎。ext参数是用于模板文件的文件扩展名,callback参数是支持Express的呈现功能的函数。许多引擎在一个_express函数中提供回调功能.例如:

app.engine('jade',require('jade')._express)

_express功能往往只能在默认的文件扩展名上工作,这种情况可以使用一个不同的函数。例如EJS提供了renderFile函数用于这一目的。可以使用下面的语句为ejs扩展名注册EJS:app.engine('ejs',require('ejs')._express).不过当想为HTML扩展名注册EJS需要使用:app.engine('html',require('ejs').renderFile).

一旦扩展名被注册,引擎回调函数被调用来呈现具有该扩展名的模板

3.加入本地对象

在呈现一个模板时,可能需要包括动态数据,这种情况下,可以生成一个locals对象,它包含映射到模板中定义的变量名称的属性。express()app对象提供了app.locals属性来存储本地变量。app.locals实际是一个函数对象,所以可以用两种不同的方式设置变量。

1.点语法

2.调用app.locals(object)来设置本地本地模板变量,其中object是一个javascript对象,它具有要设置的变量。 app.locals({title:'My App'},version:10).

4.创建模板

创建模板和创建类一样。要注意它的可重用性、规模和层次。

EJS模板比较简单,类似C#访问服务端变量一样通过<%=%><%-%><%%>来实现数据的呈现。类似C#中MVC的View

<%=%>是转义后的变量值

<%-%>不转义的变量值

<%%>javascript的逻辑代码

对于Jade模板这个我现在也没整明白,暂且放下,等以后再好好研究。

5.呈现模板

定义了一个模板也有数据了,怎么把数据显示到模板上呢?这就需要在响应中呈现模板。可以使用Express app对象或使用respons对象发送一个呈现后的模板,要呈现在Express app对象中的模板可以使用app.render()方法。

app.render(view,[locals],callback)

view参数指定views目录中的视图文件名,如果该文件没有包含扩展名,就尝试默认的扩展名。

locals参数允许传递一个locals对象

回调函数在模板被呈现后执行,并应该接受错误对象作为第一个参数,并以呈现后的模板的字符串形式作为第二个参数。

要直接把一个模板呈现为一个响应,则可以使用res.render()函数,它工作原理和app.render()完全一样,不同之处是不必有回调函数。所呈现的结果在响应中自动发送。如果不需要在发送之前对数据做任何处理,就可以使用res.render()方法,以避免需要额外的代码调用res.send()来发送数据。

6.demo

EJS模板

<!DOCTYPE html>
<html lang="en">
<head>
<title>EJS Template</title>
</head>
<body>
    <h1>User using EJS Template</h1>
    <%=title%>
    <%-title%>
    <ul>
        <li>Name: <%= uname %></li>
        <li>Vehicle: <%= vehicle %></li>
        <li>Terrain: <%= terrain %></li>
        <li>Climate: <%= climate %></li>
        <li>Location: <%= location %></li>
    </ul>
</body>
</html>

Jade模板

doctype html
html(lang="en")
  head
    title="Jade Template"
  body
    block content
extends main_jade
block content
  h1 User using Jade Template
  ul
    li Name: #{uname}
    li Vehicle: #{vehicle}
    li Terrain: #{terrain}
    li Climate: #{climate}
    li Location: #{location}

 呈现

var express = require('express'),
    jade = require('jade'),
    ejs = require('ejs');
var app = express();
app.set('views', './views');
app.set('view engine', 'jade');
app.engine('jade', jade.__express);
app.engine('html', ejs.renderFile);
app.listen(8080);

app.locals.uname = "Brad";
app.locals.vehicle = "Jeep";
app.locals.terrain = "Mountains";
app.locals.climate = "Desert";
app.locals.location = "Unknown";

app.get('/ejs', function (req, res) {
  app.locals.title="<h1>Jade<h1/>";
  app.render('user_ejs.html', function(err, renderedData){
    res.send(renderedData);    
  });
});

app.get('/jade', function (req, res) {
  res.render('user_jade');
});

 

原文地址:https://www.cnblogs.com/5ishare/p/5576048.html