目录
Express 是一个基于 Node.js 平台,快速、开放、极简的 web 开发框架。
Express 框架是后台的 Node 框架,所以和 jQuery、zepto、yui、bootstrap 都不一个东西。
Express 特点:
1. Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,它提供一系列强大的特性,帮助你创建各种 Web 和移动设备应用;
2. 丰富的 HTTP 快捷方法和任意排列组合的 Connect 中间件,让你创建健壮、友好的 API 变得既快速又简单;
3. Express 不对 Node.js 已有的特性进行二次抽象,我们只是在它之上扩展了 Web 应用所需的基本功。
1、Express
1、生成package.json:cnpm init / cnpm init --yes
2、安装:cnpm install express --save / npm install express --save
3、创建一个Express对象
var Express = require('express');
var app = new Express(); // 这里不用写new也可以
4、使用
app.get('/', (req, res) => { });
var express = require('express');
var app = new express();
app.get('/', (req, res) => {
res.send('这是一个express的主页');
});
app.get('/login', (req, res) => {
res.send('login');
});
app.get('/register', (req, res) => {
res.send('register');
});
app.listen(8001);
5、动态路由:
var express = require('express');
var app = new express();
app.get('/newContent/:aid', (req, res) => {
console.log(req.params);
res.send('newContent:aid=' + req.params.aid);
});
app.listen(8001);
6、获取get传值:
var express = require('express');
var app = new express();
app.get('/newContent', (req, res) => {
console.log(req.query);
res.send('newContent:aid=' + req.query.aid + ';cid=' + req.query.cid);
});
app.listen(8001);
7、使用ejs模板(不需要引入ejs,安装即可,通过set引擎是ejs即可):
var express = require('express');
var app = express();
/**
* 设置使用的类型模板引擎,
* 不需要引入,因为express本身就支持了
*/
app.set('view engine', 'ejs');
/**
* 指定路由的位置,
* 这里指定是因为默认的项目是nodeTest1,而不是10 express_demo
*/
app.set('views', __dirname + '/views')
// 在index.ejs和new.ejs中,有引用外部组件header.ejs的方式
app.get('/', (req, res) => {
// 不传参数,默认会在views下查找
res.render('index');
});
app.get('/new', (req, res) => {
var list = ['1111', '2222', '3333'];
// 参数
res.render('new', {
list
});
});
app.listen(8001);
8、静态文件托管:
var express = require('express');
var app = express();
app.set('view engine', 'ejs');
app.set('views', __dirname + '/views')
/**
* 静态文件托管,其实就是引用中间件
* 这里由于项目路径问题,带上外层目录:
* http://localhost:8001/css/style.css
*/
app.use(express.static('10 express_demo/public'));
/**
* 设置虚拟静态托管路径,实际上并不存在这个路径,而是根据虚拟路径,到express.static('10 express_demo/public')这个路径下去寻找
* 实际上就是通过虚拟路径去访问静态文件:
* http://localhost:8001/static/css/style.css
*/
app.use('/static', express.static('10 express_demo/public'));
// 现在,可以在ejs模板中,通过css/style.css或者static/css/style.css去访问静态文件了
app.get('/', (req, res) => {
// 不传参数,默认会在views下查找
res.render('index');
});
app.get('/news', (req, res) => {
var list = ['1111', '2222', '3333'];
// 参数
res.render('news', {
list
});
});
app.listen(8001);
// 文件news.ejs
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<!-- 引入外部ejs模板 -->
<%- include public/header.ejs%>
<h2>news</h2>
<img src="images/baidu.gif" alt="百度">
<ul>
<% for (var i = 0; i < list.length; i++) { %>
<li><%= list[i] %></li>
<% } %>
</ul>
</body>
</html>
2、Express中间件
中间件:就是在匹配路由之前和匹配路由之后执行的一系列操作,注意在某些中间件中,next()的使用
1、应用级中间件:匹配所有的路由,使用app.use
var express = require('express');
var app = express();
/**
* 应用级中间件:匹配所有的路由
*
* next():表示继续往下走,因为路由匹配之后是不会继续往下走的
*/
app.use((req, res, next) => {
console.log(new Date());
next();
});
app.get('/', (req, res) => {
res.send('first');
});
app.get('/news', (req, res) => {
res.send('news');
});
app.listen(8001);
2、路由中间件
var express = require('express');
var app = express();
/**
* 路由中间件:处理执行路由前的操作
*
* 比如:权限判断;在登录前判断,如果已登录则跳转已登录页面,未登录跳转未登录页面
*
*
*
* 1、通过app.use的方式实现路由中间件
*/
// app.use('/news', (req, res, next) => {
//
// console.log('这是通过app.use的方式 实现的路由中间件');
//
// next();
//
// });
app.get('/', (req, res) => {
res.send('first');
});
/**
* 2、通过app.get的方式,实现中间件,其实就是匹配到对应的路由,但是前面的路由不做res.send, 而是通过next()的方式,继续往下走
*/
app.get('/news', (req, res, next) => {
console.log('是通过app.get的方式 实现的路由中间件');
next();
});
app.get('/news', (req, res) => {
res.send('news');
});
app.listen(8001);
3、错误处理中间件
var express = require('express');
var app = express();
app.get('/', (req, res) => {
res.send('first');
});
app.get('/news', (req, res) => {
res.send('news');
});
/**
* 错误处理中间件,其实就是对错误进行处理
*/
app.use((req, res) => {
res.status(404).send('page 404');
});
app.listen(8001);
4、内置中间件
var express = require('express');
var app = express();
/**
* 内置中间件,比如静态托管
*/
app.use(express.static('11 express_中间件/public'));
/**
* 设置虚拟目录的方式,静态托管
*/
app.use('/static', express.static('11 express_中间件/public'));
app.get('/', (req, res) => {
res.send('first');
});
app.get('/news', (req, res) => {
res.send('news');
});
app.listen(8001);
5、第三方中间件
/**
* 第三方中间件(模块)是用的最多的
*
* 比如获取post提交的数据:安装body-parser
*
* 1、cnpm install body-parser --save
*
* 2、var bodyParser = require('body-parser');
*
* 4、app.use(bodyParser.urlencoded({ extended: false }));
* app.use(bodyParser.json());
*
* 5、获取post数据:req.body
*
*/
var express = require('express');
var app = express();
// 设置模板引擎
app.set('view engine', 'ejs');
// 指定模板引擎的目录
app.set('views', __dirname + '/views');
// 使用第三方中间件:body-parser
var bodyParser = require('body-parser');
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }));
// parse application/json
app.use(bodyParser.json());
app.get('/login', (req, res) => {
// login.ejs是一个登录页面,form表单的action="/dologin"
res.render('login');
});
app.post('/dologin', (req, res) => {
console.log(req.body);
res.send('登录成功!');
});
app.listen(8001);
3、Cookie(不单独使,安全性比较低,一般通过express-session,设置cookie)
使用第三方中间件:cookie-parser
1、cnpm install cookie-parser --save
2、var cookieParser = require('cookieParser');
3、app.use(cookieParser());
4、使用:res.cookie(name, value, configure)
// 参数1:cookie名称
// 参数2:cookie的值
// 参数3:cookie的配置信息
var express = require('express');
var app = express();
var cookieParser = require('cookie-parser');
app.use(cookieParser());
/**
* 这里需要注意的是,
* 通过:res.cookie()设置cookie,
* 通过:req.cookies获取cookie
*/
app.get('/', (req, res) => {
console.log(req.cookies);
res.send('first');
});
app.get('/news', (req, res) => {
console.log(req.cookies);
res.send('news');
});
app.get('/set', (req, res) => {
// 参数1:cookie名称
// 参数2:cookie的值
// 参数3:cookie的配置信息
res.cookie('username', 'cookie的值', {maxAge: 600 * 1000});
res.send('设置cookie成功');
});
app.listen(8001);
一个小知识点,给本机设置默认的域名地址访问方式。打开C:\Windows\System32\drivers\etc\hosts文件中,最后添加:
127.0.0.1 www.aaa.com
127.0.0.1 news.aaa.com
这样,本地默认访问的方式127.0.0.1/localhost可以,变成访问www.aaa.com或者news.aaa.com,便于测试哈哈(有点鸡肋)。
cookie指定域名可以访问到
var express = require('express');
var app = express();
var cookieParser = require('cookie-parser');
app.use(cookieParser());
/**
* 设置cookie的配置信息,
* maxAge:
* cookie的过期时间
*
* httpOnly:
* 表示cookie只能在服务端修改,而不能通过客户端js修改
*
* domain作用:
* 让多个二级域名下共享cookie,而其他的域名或者ip则访问不到,例如:
* 模拟域名:在C:\Windows\System32\drivers\etc\hosts文件中,最后添加
* 127.0.0.1 www.aaa.com
* 127.0.0.1 news.aaa.com
* 这样就绑定了两个二级域名到本地,而domain则设置成".aaa.com"即可
* 这样,通过www.aaa.com:8001和www.aaa.com:8001/news就都可以访问到cookie了
*
*
* path作用:
* 让cookie在指定路由下才能被访问,例如path: '/news',
* 这样,只有www.aaa.com:8001/news可以访问到cookie,而www.aaa.com:8001访问不到
*
*/
app.get('/', (req, res) => {
console.log(req.cookies);
res.send('first');
});
app.get('/news', (req, res) => {
console.log(req.cookies);
res.send('news');
});
app.get('/set', (req, res) => {
// 参数1:cookie名称
// 参数2:cookie的值
// 参数3:cookie的配置信息
res.cookie('username', 'cookie的值', {maxAge: 600 * 1000, domain: '.aaa.com', httpOnly: true, path: '/news'});
res.send('设置cookie成功');
});
app.listen(8001);
cookie的加密属性
var express = require('express');
var app = express();
var cookieParser = require('cookie-parser');
/**
* 设置cookie的配置信息
*
* 加密cookie,signed:
* 默认cookie是明文的,通过设置signed:true,可以自动给cookie加密,用法:
* 1、设置随机加密字符串:app.use(cookieParser('sign'));
* 2、设置cookie配置属性:signed:true;
* 3、获取:req.signedCookies;
*
*/
app.use(cookieParser('sign'));
app.get('/', (req, res) => {
// 获取明文的cookies
// console.log(req.cookies);
// 获取有加密的cookies
console.log(req.signedCookies);
res.send('first');
});
app.get('/news', (req, res) => {
// 获取明文的cookies
// console.log(req.cookies);
// 获取有加密的cookies
console.log(req.signedCookies);
res.send('news');
});
app.get('/set', (req, res) => {
// 参数1:cookie名称
// 参数2:cookie的值
// 参数3:cookie的配置信息
res.cookie('username', 'cookie的值', {maxAge: 600 * 1000, signed: true});
res.send('设置cookie成功');
});
app.listen(8001);
4、Session
一个简单的登录例子
/**
* Session其实就是一个键值对,通过在服务端生成一个键值对(key-value),
* 将key返回给客户端cookie,而客户端通过key,请求服务器拿到value。
*
*
* 1、安装express-session:
* cnpm install express-session --save
*
* 2、引用:
* var session = require('express-session');
*
* 3、设置中间件:
* app.use(session({
*
* }));
*
* 4、使用:
* 设置session:req.session.userinfo = '张三';
*
* 获取req.session.userinfo
*/
var express = require('express');
var app = express();
var session = require('express-session');
app.use(session({
secret: 'this is string key', // 设置随机加密字符串
name: 'session_id', // 保存在本地cookie的名称,默认是connect_sid
resave: false, // 强制保存session,及时它没有初始化,默认为true,建议设置成false
saveUninitialized: true, // 强制将为初始化的session存储,默认是true, 建议是true,此时也会生成一个session
// cookie: { secure: true }, // secure是设置访问cookie的权限,true设置https,false设置http,这里的cookie和前面设置cookie的配置信息一致
cookie: {
maxAge: 5 * 1000
},
rolling: true, // 设置如果用户一直访问,则强制重新设置cookie,此时会重置maxAge,默认false,false下,无论用户是否访问,maxAge的时间一到,cookie、session就销毁
}));
app.get('/', (req, res) => {
if (req.session.userInfo) {
res.send('账号:' + req.session.userInfo + ',欢迎回来。');
} else {
res.send('未登录');
}
});
app.get('/login', (req, res) => {
// 如果直接req.session; 表示没有初始化session
req.session.userInfo = '张三1111';
res.send('登录成功');
});
app.listen(8001);
退出登录时,销毁session
app.get('/loginOut', (req, res) => {
// 常用的设置session失效的方式
// 1、设置cookie的maxAge=0
// req.session.cookie.maxAge = 0;
// 2、通过session的destroy方法销毁session
req.session.destroy(err => {
console.log(err);
});
res.send('退出登录成功');
});
自动保存session到MongoDB数据库,访问http://127.0.0.1:8001/login,登录之后,会在数据库中生成一个sessions集合,示例代码和数据库如下:
/**
* 1、安装 express-session和connect-mongo
*
* 2、引入express-session和connect-mongo
* var session = require('express-session');
* var MongoStore = require('connect-mongo')(session);
*
* 3、配置session的store属性
* app.use(session({
* // ... 其他的属性
* store: new MongoStore({
url: 'mongodb://127.0.0.1:27017/shop',
touchAfter: 24 * 3600 // 在不改变session的情况下,24小时才刷新一次到数据库
})
}));
4、重启服务器,登录之后,数据库会自动生成sessions集合,并且插入数据
db.sessions.find()
*/
var express = require('express');
var app = express();
var session = require('express-session');
var MongoStore = require('connect-mongo')(session);
app.use(session({
secret: 'this is string key', // 设置随机加密字符串
name: 'session_id', // 保存在本地cookie的名称,默认是connect_sid
resave: false, // 强制保存session,及时它没有初始化,默认为true,建议设置成false
saveUninitialized: true, // 强制将为初始化的session存储,默认是true, 建议是true,此时也会生成一个session
// cookie: { secure: true }, // secure是设置访问cookie的权限,true设置https,false设置http,这里的cookie和前面设置cookie的配置信息一致
cookie: {
maxAge: 30 * 60 * 1000
},
rolling: true, // 设置如果用户一直访问,则强制重新设置cookie,此时会重置maxAge,默认false,false下,无论用户是否访问,maxAge的时间一到,cookie、session就销毁
store: new MongoStore({ // 访问之后会自动在login数据中自动创建sessions集合并插入数据
url: 'mongodb://127.0.0.1:27017/login',
touchAfter: 24 * 3600
})
}));
app.get('/', (req, res) => {
if (req.session.userInfo) {
res.send('账号:' + req.session.userInfo + ',欢迎回来。');
} else {
res.send('未登录');
}
});
app.get('/login', (req, res) => {
// 如果直接req.session; 表示没有初始化session
req.session.userInfo = '张三1111';
res.send('登录成功');
});
app.get('/loginOut', (req, res) => {
// 常用的设置session失效的方式
// 1、设置cookie的maxAge=0
// req.session.cookie.maxAge = 0;
// 2、通过session的destroy方法销毁session
req.session.destroy(err => {
console.log(err);
});
res.send('退出登录成功');
});
app.listen(8001);