node.js的token、path模块,multer中间件和两种模板引擎

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 等模块外
还有两个特殊成员 (都是动态获取)

  1. __dirname
    获取当前文件模块所属目录的绝对路径
  2. __filename
    获取当前文件的绝对路径
    Node 文件操作路径中 相对路径是根据执行node命令所处的路径
    解决方法 用绝对路径
    path.join( __dirname 来拼接路径 )

Path 模块

  1. path 模块 (内置模块) 操作系统的磁盘路径

  2. path.join( 路径1 ,路径2, …)
    按参数顺序把多个路径组成到一起 并返回

  3. path.parse(路径字符串)
    能把路径字符串转成对象并返回
    ext 是文件后缀名
    name 文件 不含后缀名

  4. path.basename( 路径 , 选填 )
    第二个参数选填 如果传个 .js 就 可以省略 .js 后缀名
    能获取到 第一个参数的 文件名部分 忽略 路径

  5. path.dirname( 路径)
    获取一个路径中的目录部分

  6. path.extname ( 路径 )
    获取一个路径中的 后缀名部分

  7. path.isAbsolute( 路径)
    判断这个路径是不是绝对路径

  8. 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 %> 注释标签,不会输出,也不会执行
  • <%% 转义为 ‘<%’
  • <% … -%> 删除新的空白行模式
  • <%_ … _%> 删除前后空白符模式
发布了11 篇原创文章 · 获赞 1 · 访问量 131

猜你喜欢

转载自blog.csdn.net/Shura0/article/details/104827215
今日推荐