Token 思想
在服务端不需要存储用户的登陆记录 全部发给客户端由客户端自己存 (cookie localstorage)
1、客户端使用用户名跟密码请求登录
2、服务端收到请求,去验证用户名与密码
3、验证成功后,服务端会签发一个Token (加了密的字符串),再把这个Token发送给客户端
4、客户端收到Token以后可以把它存储起来,比如放在Cookie里或者Local Storage里
5、客户端每次向服务端请求资源的时候需要带着服务端签发的Token
6、服务端收到请求,然后去验证客户端请求里面带着的Token,如果验证成功,就向客户端返回请求的数据
用Token 需要安装一个模块
npm install jsonwebtoken
token的使用
// 通过 sign 方法 生成 token 返回值是 token
```javascript
//第一个参数是需要加密的 数据
let token = token.sign({ username: req.query.username}, "abc",{ expiresIn: 35});
// 第二个参数 加密的方式 第三个参数 过期时间 单位是秒
效验 token
// 2 效验token 第一个参数是 token 第二个参数 是解密规则 (加密的第二个参数)
// 第三个参数 回调函数 如果没有出错 err 是null decode 就是登陆时存的数据
jwt.verify(token, "abc", (err, decode) =>{}
Session 和Token 的区别
- 服务端保存用户信息 session 会保存 token不保存
- session 不可以 避免SCRF攻击
- token 可以避免SCRF攻击
- session安全性 一般 token 安全性高
- session 存在多服务器粘性问题 token 不存在
Node中的非模块成员
在每个模块中 除了 require exports 等模块外
还有两个特殊成员 (都是动态获取)
- __dirname
获取当前文件模块所属目录的绝对路径 - __filename
获取当前文件的绝对路径
Node 文件操作路径中 相对路径是根据执行node命令所处的路径
解决方法 用绝对路径
path.join( __dirname 来拼接路径 )
Path 模块
-
path 模块 (内置模块) 操作系统的磁盘路径
-
path.join( 路径1 ,路径2, …)
按参数顺序把多个路径组成到一起 并返回 -
path.parse(路径字符串)
能把路径字符串转成对象并返回
ext 是文件后缀名
name 文件 不含后缀名 -
path.basename( 路径 , 选填 )
第二个参数选填 如果传个 .js 就 可以省略 .js 后缀名
能获取到 第一个参数的 文件名部分 忽略 路径 -
path.dirname( 路径)
获取一个路径中的目录部分 -
path.extname ( 路径 )
获取一个路径中的 后缀名部分 -
path.isAbsolute( 路径)
判断这个路径是不是绝对路径 -
path.resolve()
可以像path.join() 一样拼接字符串,也可以直接传完整路径
如果传的参数不带盘符那么就会按 __dirname 来算
会从右向左 寻找盘符 如果找到盘符 那么盘符之前的路径片段会忽略
文件上传 (multer 中间件)
multer 接受 form-data 编码数据 所有要求前端携带时注意一下 如:
安装
npm install multer -s //-s表示项目依赖
使用和配置
//文化上传
//1 引入 multer
let multer = require('multer')
// 2 实例化 multer
let objMulter = multer( { dest: './public/upload' } ); //dest 指定保存位置(存到服务器)
// 3 安装中间件
// app.use(objMulter.image()) //值允许 上传图片的类型
app.use(objMulter.any()) //运行时上传什么类型的文件 any 表示都可以
app.post("/reg", (req, res) => {
console.log(req.files); //拿到的是一个数组 数组里面有对象 对象里面有图片的详细信息
// fieldname:表单name名
// originalname:.上传的文件名
// encoding:编码方式
// mimetype:文件类型
// buffer:文件本身
// size:尺寸
// destination:保存路径
// filename:保存后的文件名不含后缀
// path:保存磁盘路径+保存后的文件名 不含后缀
// 4 文件改名
let oldFile = req.files[0].path;
let newFile = req.files[0].path + path.extname(req.files[0].originalname);
fs.renameSync(oldFile, newFile);
// 5 把磁盘路径转成网络路径存入库操作
// 6 将地址返回给客户端
res.send({
err: 0,
url:'http://localhost:8888/upload/' + req.files[0].filename + path.extname(req.files[0].originalname)
});
});
Jade 模板
原理:
- fs抓取前端静态页面+ jade +数据-> 返回send(data) >浏览器
特点:
- 侵入式,强依赖
安装
npm install jade
配置和使用
//引入
let jade = require('jade')
app.get('/',(req,res) => {
// 第一个参数 是要解析的jade 模板路径 第二个参数是对象 里面是要渲染的数据
let html = jade.renderFile("./views/index.jade",{data: `你好啊Jade`})
res.send(html)
})
// 在jade模板里面渲染数据用 #{ 要渲染的数据 }
ejs模板
原理
- fs抓取前端静态页面+ jade +数据-> 返回send(data) >浏览器
特点
- 非侵入式,温和,弱依赖
安装
npm install ejs
配置和使用
let ejs = require('ejs')
app.get('/',(req,res) => {
//第一个参数是 ejs 模板文件 第二个参数是 要合并的模板文件的数据 第三个参数回调函数
ejs.renderFile('./views/index.ejs',{data:'我是EJS数据'},(err,data) => {
console.log(err); //没报错就是null
console.log(data); //解析的内容
if (!err) {
res.send(data)
}
})
})
1
EJS 模板基础语法
<% … %> 包含js代码
- <%= … %> 输出变量 变量若包含 ‘<’ ‘>’ '&'等字符 会被转义
- <%- … %> 输出变量 不转义
- <%- include(‘其他模板名’) %> 引入其他模板 包含 ./user/show.ejs
- <%# some comments %> 注释标签,不会输出,也不会执行
- <%% 转义为 ‘<%’
- <% … -%> 删除新的空白行模式
- <%_ … _%> 删除前后空白符模式