关闭页面特效

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

0|1EJS 模板基础语法


<% … %> 包含js代码

  • <%= … %> 输出变量 变量若包含 ‘<’ ‘>’ '&'等字符 会被转义
  • <%- … %> 输出变量 不转义
  • <%- include(‘其他模板名’) %> 引入其他模板 包含 ./user/show.ejs
  • <%# some comments %> 注释标签,不会输出,也不会执行
  • <%% 转义为 ‘<%’
  • <% … -%> 删除新的空白行模式
  • <%_ … _%> 删除前后空白符模式

__EOF__

作  者智勇_y
出  处https://www.cnblogs.com/blender-su/p/17758295.html
关于博主:编程路上的小学生,热爱技术,喜欢专研。评论和私信会在第一时间回复。或者直接私信我。
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!

posted @   智勇_y  阅读(17)  评论(0编辑  收藏  举报  
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
0
0
关注
跳至底部
点击右上角即可分享
微信分享提示