Express 简单介绍
Express 是一个基于 Node.js 平台,快速、开放、极简的 web 开发框架,它提供一系 列强大的特性,帮助你创建各种 Web 和移动设备应用。
Express 安装使用
npm install express --save
Express的使用
const express = require("express"); /*引入 express*/
var app = express(); /*实例化 express 赋值给 app*/
//配置路由 匹配 URl 地址实现不同的功能
app.get("/", (req, res) => {
res.send("get方法");
})
app.post("/post", (req, res) => {
res.send("post方法");
})
//动态路由配置: 配置路由时要注意顺序
app.get("/user/:id", (req, res) => {
var id = req.params["id"]; //得到动态路由中的id值
res.send(id);
})
//get传值
//http://localhost:3000/news?id=2&sex=nan
app.get("/news", (req, res) => {
let query = req.query; //获取get传值可以得到{"id":"2","sex":"nan"}
res.send(query);
})
app.listen(3000); //监听的端口号
Express 框架中 ejs 的安装使用
ejs简介:
EJS 是一套简单的模板语言,帮你利用普通的 JavaScript 代码生成 HTML 页面。EJS 没有如何组织内容的教条;也没有再造一套迭代和控制流语法;有的只是普通的 JavaScript 代码而已。
/*
1.安装 npm install ejs --save
2.配置 app.set("view engine","ejs")
3.使用 (默认加载模板引擎的文件夹是views)
res.render("index",{//加载index文件
})
*/
const express = require("express"); /*引入 express*/
var app = express(); /*实例化 express 赋值给 app*/
//配置模板引擎
app.set('views', __dirname + '/views');//指定模板位置 ,默认模板位置在 views可写可不写
app.set("view engine", "ejs");
app.use(express.static("static")) //配置静态资源目录,加载css样式,使用static目录下的静态资源
app.get("/", (req, res) => {
let title = "你好ejs" //传递参数
var userinfo = { //传递方法
username: "张三",
age: 20
}
let article = "<h3>我是一个h3</h3>" //输出一个html
let list = ["1111", "2222", "3333"]
res.render("index.ejs", { //默认加载views文件夹 。加载index文件
title, //从后台给前台传递数据
userinfo,
article,
list,
flag: true, //判断
})
})
app.listen(3001); //监听的端口号
Ejs 后缀修改为 Html代码
//这是一个小技巧,看着.ejs 的后缀总觉得不爽,使用如下方法,可以将模板文件的后缀换成我们习惯的.html。
//1.在 app.js 的头上定义 ejs:,代码如下:
var ejs = require('ejs');
//2.注册 html 模板引擎代码如下:
app.engine('html', ejs.__express);
//3.将模板引擎换成 html 代码如下:
app.set('view engine', 'html');
// 4.修改模板文件的后缀为.html。
界面代码
express的中间件
通俗的讲: 中间件就是匹配路由之前或者匹配路由完成做的一系列的操作。中间件中如果想往下 匹配的话,那么需要写 next()
Express 应用可使用如下几种中间件:
应用级中间件, 路由级中间件, 错误处理中间件, 内置中间件 ,第三方中间件
- 应用级中间件(用于权限判断)
app.use((req, res, next) => { /*匹配任何路由*/
console.log(new Date())
next();/*表示匹配完成这个中间件以后程序继续向下执行*/
})
- 路由中间件
app.use("/news/:id",(req,res)=>{// 用的非常少
res.send("动态路由");
})
- 错误处理中间件
app.use((req, res, next) => {
res.status(404).send("404");//界面不匹配就会出现404
})
- 内置中间件
配置静态资源目录,加载css样式,使用static目录下的静态资源
app.use(express.static("static"));//匹配路由之前,他首先会去这个static文件夹目录找是否匹配
- 第三方中间件
例子:
body-parser 中间件 第三方的 获取 post 提交的数据(最常见方法)
用法
获取post传过来的数据
1.cnpm install body-parser --save
2.var bodyParser = require(‘body-parser’)
3.设置中间件
处理 form 表单的中间件:
app.use(bodyParser.urlencoded({ extended: false })); //form 表单提交的数据
app.use(bodyParser.json()); //提交的 json 数据的数据
4.req.body 获取数据
代码:
const express = require("express"); /*引入 express*/
var app = express(); /*实例化 express 赋值给 app*/
var ejs = require('ejs');
//2.注册 html 模板引擎代码如下:
var bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.engine('html', ejs.__express);
//3.将模板引擎换成 html 代码如下:
app.set('view engine', 'html');
// 4.修改模板文件的后缀为.html。
//配置模板引擎
app.use(express.static("static")) //配置静态资源目录,加载css样式,使用static目录下的静态资源
app.get("/", (req, res) => {
res.send("首页");
})
app.get("/login", (req, res) => {
//req.query;获取get传值
res.render("login", {
})
})
app.post("/doLogin", (req, res) => {
//获取post传值
var body = req.body;
console.log(body);
res.send("执行提交" + body.username); //发送一定要发送字符串,只发送body会报错,不能发送方法
})
app.listen(3001); //监听的端口号
Express Cookie 的基本使用
Cookie 简介
1.cookie 是存储于访问者的计算机中的变量。可以让我们用同一个浏览器访问同一个域 名的时候共享数据。
2.HTTP 是无状态协议。简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页 面,服务器无法认识到这是同一个浏览器在访问同一个网站。每一次的访问,都是没有任何 关系的。
3.Cookie 是一个简单到爆的想法:当访问一个页面的时候,服务器在下行 HTTP 报文中, 命令浏览器存储一个字符串; 浏览器再访问同一个域的时候,将把这个字符串携带到上行 HTTP 请求中。第一次访问一个服务器,不可能携带 cookie。 必须是服务器得到这次请求, 在下行响应报头中,携带 cookie 信息,此后每一次浏览器往这个服务器发出的请求,都会 携带这个 cookie。
Cookie 的使用
1.安装 cnpm instlal cookie-parser --save
2.引入 var cookieParser = require(‘cookie-parser’);
3.设置中间件
app.use(cookieParser());
4.设置 cookie
res.cookie(“name”,‘zhangsan’,{maxAge: 900000, httpOnly: true});
5. 获取 cookie
req.cookies.name
实现不同页面之间的数据共享
const express = require("express");
const app = express();
//引入
var cookieParser = require('cookie-parser');
//设置中间件
app.use(cookieParser());
app.get("/", (req, res) => {
//设置cookie,如果cookie没有过期的话,关闭浏览器后重新打开,cookie不会销毁
res.cookie("username", 'zhangsan', { maxAge: 900000, httpOnly: true });
res.send("你好啊");
})
app.get("/article", (req, res) => {
//获取cookie
let username = req.cookies.username;
//console.log(req.signedCookies.username); 使用cookie加密厚获取cookie
console.log(username)
res.send("新闻页面" + username);
})
app.get("/user", (req, res) => {
res.send("用户页面");
})
app.listen(3003);
由于这样使用cookie容易被客服端改动,所以后期需要给cookie加密
Cookie 属性说明
属性 | 描述 |
---|---|
domain | 域名 name=value:键值对,可以设置要保存的 Key/Value,注意这里的 name 不能和其他属性项的名字一样 (多个域名共享cookie) |
Expires | 过 期 时 间 ( 秒 ) , 在 设 置 的 某 个 时 间 点 后 该 Cookie 就 会 失 效 , 如 expires=Wednesday, 09-Nov-99 23:12:40 GMT |
maxAge | 最大失效时间(毫秒),设置在多少后失效 |
secure | 当 secure 值为 true 时,cookie 在 HTTP 中是无效,在 HTTPS 中才有效 |
Path | 表示 cookie 影响到的路路径,如 path=/。如果路径不能匹配时,浏览器则 不发送这个 Cookie |
httpOnly | 是微软对 COOKIE 做的扩展。如果在 COOKIE 中设置了“httpOnly”属性,则通 过程序(JS 脚本、applet 等)将无法读取到 COOKIE 信息,防止 XSS 攻击产生 |
singed | 表示是否签名 cookie, 设为 true 会对这个 cookie 签名,这样就需要用 res.signedCookies 而不是 res.cookies 访问它。被篡改的签名 cookie 会被服务 器拒绝,并且 cookie 值会重置为它的原始值 |
设置 cookie 的几种方法
//设置cookie ,有效时间为60分钟
res.cookie("username", 'zhangsan', { maxAge: 1000*60*60,});
//多个域名共享cookie aaa.itying.com bbb.itying.com 能同时 共享cookie
res.cookie("username", 'zhangsan', { maxAge: 900000, domain:".itying.com"});
cookie加密(一般使用cookie都会加密)
- 配置中间件的时候需要传参
var cookieParser = require('cookie-parser');
app.use(cookieParser('123456'));
- 设置 cookie 的时候配置 signed 属性
res.cookie('userinfo','hahaha',{domain:'.ccc.com',maxAge:900000,signed:true});
- signedCookies 调用设置的 cookie
console.log(req.signedCookies);
Express Session 的基本使用
- Session 简单介绍
session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 session 保存在服务器上。
Cookie 数据存放在客户的浏览器上,Session 数据放在服务器上。Session 相比 Cookie 要 更安全一些。由于 Session 保存到服务器上,所以当访问量增多的时候,会比较占用服务器 的性能。单个 cookie 保存的数据大小不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie。Session 没有这方面的限制。Session 是基于 Cookie 进行工作的。
- express-session 的使用
1、安装 express-session
cnpm install express-session --save
2、引入 express-session
var session = require(“express-session”);
3. 设置官方文档提供的中间件
app.use(session({}))
4. 使用
设置值 req.session.username = “张三”;
获取值 req.session.username
- express-session 的常用参数
参数 | 作用 |
---|---|
secret | 一个 String 类型的字符串,作为服务器端生成 session 的签名。 |
name | 返回客户端的 key 的名称,默认为 connect.sid,也可以自己设置。 |
resave | 强制保存 session 即使它并没有变化,。默认为 false。 don’t save session if unmodified |
saveUninitialized | 强制将未初始化的 session 存储。当新建了一个 session 且未设定属性或值时,它就 处于未初始化状态。在设定一个 cookie 前,这对于登陆验证,减轻服务端存储压力,权 限控制是有帮助的。(默认:true)。建议手动添加。 |
cookie | 设置返回到前端 key 的属性,默认值为{ path: ‘/’, httpOnly: true, secure: false,maxAge: null }。 |
rolling | 在每次请求时强行设置 cookie,这将重置 cookie 过期时间(默认:false) |
- 使用例子
const express = require("express");
const app = express();
var session = require("express-session");
//配置session的中间件
app.use(session({
secret: 'keyboard cat', //服务器端生成session的签名 (可以随便写)
name: "itying", //修改session对应的cookie的名称
resave: false, //强制保存session即使他没有变化 默认
saveUninitialized: true, //强制将未初始化的session存储
cookie: { secure: false }, //配置cookie的信息 secure:true表示只有https协议才能访问cookie
rolling: true, //在每次请求时强行设置cookie,这将重置cookie过期时间(默认:false)
}))
app.get("/login", (req, res) => {
//设置session
req.session.username = "张三"
res.send("执行登录");
});
app.get("/", (req, res) => {
//获取session
if (req.session.username) {
res.send("已经登录");
} else {
res.send("没有登录");
}
});
app.get("/loginOut", (req, res) => {
//1.设置session的过期时间为0 (他会把所有的session都销毁,)
res.session.cookie.maxAge = 0;
//2.销毁指定session(用的比较多)
req.session.username = "";
//3.销毁所有的session
req.session.destroy();
res.send("退出登录");
})
app.listen(3000);
- 负载均衡配置 Session,把 Session 保存到数据库里面
1.需要安装 express-session 和 connect-mongo 模块
2.引入模块
var session = require("express-session");
const MongoStore = require('connect-mongo')(session);
3.配置中间件
app.use(session({
store: new MongoStore({
url: 'mongodb://127.0.0.1:27017/student', //配置数据库地址
touchAfter: 24 * 3600 //不管发出了多少请求,在24小时内值更新一次session,除非你改变了这个session
})
}))
- Express 路由模块化
Express 中允许我们通过 express.Router 创建模块化的、可挂载的路由处理程 序。
1.新建一个 login.js 配置如下代码
const express = require("express");
var router = express.Router();
//访问http://localhost:3000/login
router.get("/", (req, res) => {
//req.query;获取get传值
res.send("你好啊");
})
//访问http://localhost:3000/login/aa
router.get("/aa", (req, res) => {
//req.query;获取get传值
res.send("aa");
})
module.exports = router
2.在主js文件中挂载这个模块文件
const express = require("express"); /*引入 express*/
var app = express(); /*实例化 express 赋值给 app*/
//引入外部模块
const login = require("./routes/login");
//2.注册 html 模板引擎代码如下:
//挂在login模块
app.use("/login", login);
app.get("/", (req, res) => {
res.send("首页");
})
app.listen(3000); //监听的端口号
Express 结合 multer 上传图片
- Multer 模块介绍
Multer 是一个 node.js 中间件,用于处理 multipart/form-data 类型的表单数据,它主要用 于上传文件。它是写在 busboy 之上非常高效。
注意: Multer 不会处理任何非 multipart/form-data 类型的表单数据。