使用node.js进行web开发
1.安装express
npm install -g express-generator
4.0+版本中将命令工具分出来了,所以可以不安装express,但必须要安装express-generator
2.新建工程
初始化一个 express 项目并安装所需模块,模板引擎默认格式是jade
express 文件夹名
要建ejs格式,需要加上-e
cd 文件夹名 && npm install
新建服务器
node bin/www 或 supervisor bin/www
app.js:启动文件,或者说入口文件
package.json:存储着工程的信息及模块依赖,当在 dependencies 中添加依赖的模块时,运行 npm install,npm 会检查当前目录下的 package.json,并自动安装所有指定的模块
node_modules:存放 package.json 中安装的模块,当你在 package.json 添加依赖的模块并安装后,存放在这个文件夹下
public:存放 image、css、js 等文件
routes:存放路由文件
views:存放视图文件或者模版文件
bin:存放可执行文件
routes/index.js 路由文件,相当于控制器,用于组织展示的内容:
var express = require(‘express‘);
var router = express.Router();
/* GET home page. */
router.get(‘/‘, function(req, res, next) {
res.render(‘index‘, { title: ‘Express‘ });
});
module.exports = router;
当访问主页时,调用jade模板引擎,来渲染 index.jade 模版文件(即将 title 变量全部替换为字符串 Express),生成静态页面并显示在浏览器中。
index.ejs 模板文件,routes/index.js调用的模板。功能是显示引用的变量,即res.render函数第二个参数传入的对象的属性。
<!DOCTYPE html> <html> <head> <title><%= title %></title> <link rel=‘stylesheet‘ href=‘/stylesheets/style.css‘ /> </head> <body> <h1><%= title %></h1> <p>Welcome to <%= title %></p> </body> </html>
layout.ejs
默认情况下所有的模板都继承自layout.jade,即block content是独特的内容,其余部分共有,可以看作是页面框架、
3.路由控制
创建路由规则
在Index.js后添加
router.get(‘/‘, function(req, res, next) { res.render(‘index‘, { title: ‘Express‘ }); });
路径匹配
router.get(‘/user/:username‘,function(req,res) { res.send(‘user:‘ + req.params.username); })
路径规则/user/:username会被自动编译成正则表达式,类似于 \ /user\ /( [^\ /]+)\ /?的形式。路径参数可以在相应函数通过req.params的属性访问。
REST风格的路由规则
REST:表征状态转移,是一种基于HTTP协议的网络应用的接口风格,充分利用HTTP的方法实现统一风格接口的服务。
GET:请求获取指定资源
POST:向指定资源提交数据
PUT:请求服务器存储一个资源
DELETE:请求服务器删除指定资源
这4种方法通常实现的功能
GET:获取
POST:新增
PUT:更新
DELETE:删除
express支持同一路径绑定多个路由相应函数。但请求总是被前一条路由规则捕获,但后面的规则会被忽略。
app.all(‘/user/:username‘, function(req, res) { res.send(‘all method captured‘); }); app.all(‘/user/:username‘, function(req, res) { res.send(‘user: ‘ + req.params.username); });
路由控制权转移的方法, 即回调函数的第三个参数next,通过调用next(),会将路由控制权转移给后面的规则。
router.all(‘/user/:username‘, function (req, res, next) { console.log(‘all method captured‘); next(); }); router.all(‘/user/:username‘, function (req, res) { res.send(‘user: ‘ + req.params.username); });
访问http://localhost:3000/user/sura时,终端打印了‘all method captured,而且浏览器中显示了user: sura。这说明请求先被一个条路由规则捕获,完成console.log使用next()转移控制权,又被第二条规则捕获,向浏览器返回信息。
可以实现中间件,而且能提高代码的复用程度。
模板引擎
是一个页面模板根据一定的规则生成HTML的工具。模板引擎的功能是将页模板和要显示的数据结合的HTML页面,它既可以运行在客户端又可以运行在服务器端,大多数时候它都在服务器端直接被解析为HTML,解析完成后再传输给客户端。
在MVC架构中,模板引擎包含在服务器端,控制权得到用户请求后,从模型获取数据,调用模板引擎。模板引擎以数据和页面为输入,生成HTML页面,然后返回给控制器,由控制器返回给客户端。
app.js设置模板引擎和页面模板的位置
app.set(‘views‘, path.join(__dirname, ‘views‘));
app.set(‘view engine‘, ‘ejs‘);
routes/index.js的exports.index函数调用模板引擎
res.render(‘index‘, { title: ‘Express‘ });
res.render的功能是调用模板引擎,并将 其产生的页面直接返回给客户端。它接收两个参数,第一个是模板的名称,即views目录下的目标文件名,不包含扩展名;第二个参数是传递给模板的数据。
index.ejs
<h1><%= title %></h1>
<p>Welcome to <%= title %></p>
<% code %>:javascript代码
<%= code %>:显示替换过HTML特殊字符的内容
<%- code %>:显示原始HTML内容
页面布局
layout.ejs是一个页面布局模板,它描述了整个页面的框架结构,默认情况下每个独立的页面都继承自这个框架,替换掉<%- body %>部分。因为一般为了保持整个网站的一致风格,HTML页面的<head>部分以及页眉页脚中的大量内容是重复的。
3.X版本后不支持layout
方法1:include
把index.html页面切分成3个部分:header.html, index.html, footer.html
header.html, 为html页面的头部区域
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title><%=: title %></title> <!-- Bootstrap --> <link href="/stylesheets/bootstrap.min.css" rel="stylesheet" media="screen"> <!-- <link href="css/bootstrap-responsive.min.css" rel="stylesheet" media="screen"> --> </head> <body screen_capture_injected="true">
index.html, 为内容显示区域
<% include header.html %> <h1><%= title %></h1> <p>Welcome to <%= title %></p> <% include footer.html %>
footer.html,为页面底部区域
<script src="/javascripts/jquery-1.9.1.min.js"></script> <script src="/javascripts/bootstrap.min.js"></script> </body> </html>
方法2:自行添加layout
在package.json里面的dependencies添加"express-partials": “*”
"dependencies": { "express": "3.1.0", "ejs": "*", "express-partials": "*" }
运行cmd并切换至项目目录运行npm install获得最新版
在app.js引用express-partials
var partials = require(‘express-partials‘);
在app.set(‘view engine’, ‘ejs’);下面添加app.use(partials());
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。