【前端45_前后端交互】jwt 授权和鉴权、请求工具:Axios、拦截器、简版 Axios、fetch
前后端交互jwt (JSON web token)简介判断你是否有权限和服务器进行交互,相当于一个门禁吧,过程如下
知识点补充token:服务端登录成功后进行签发哈希:对复杂的数据进行摘要,10G 的内容,如果改了1kb ,那么它的哈希值也会改变的
实现方式流程:我们以登录过程为例子,登录成功后签发 token,访问接口时携带 token
签发 Token可以通过 jsonwebtoken 这个模块去签发 token,参考 npm 上的模块说明,也可以参考 https://jwt.io/ 查看 token 的信息
签发的过程如下
12345678const jwt = require("jsonwebtoken"); // 签发 token 的模块let token = jwt.sign( { name: "some value", }, // token 中携带的一些参数,你可以自己写,用 base64 加密的 "mytoken", // 秘钥名称,等会用来鉴权时会用到 { ...
【前端44_前后端交互_跨域】前端解决:JSONP、后端解决:CORS 、后端代理
跨域什么是跨域跨域是浏览器为了安全而报的错误,如果不同源去请求资源,那么就会报跨域的错误。
同源概念:协议,域名,端口号一致
报错类似如下
Access to XMLHttpRequest at 'http://localhost:4000/getAjax' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
跨域是后台接口已经通了,但是浏览器拦截掉了,浏览器处于安全角度考虑,拦截掉了数据。
前端解决: JSONP只支持 get 方式,不支持 post 方式
实现原理html 中有些标签是没有同源限制的,比方说 script、iframe、img 等,其中用到的就是 script 了
1234<script src="..."></script> ...
【前端43_前后端交互】Ajax、网络请求、同步和异步请求、FormData 实现文件上传、监控上传速度和进度
Ajax 简单介绍Ajax 即 “Asynchronous Javascript And XML”(异步 JavaScript 和 XML)
它是一项技术,提高了用户的体验,为什么这么说呢?
场景举个栗子,如果我们做个登录的功能,当用户输入完姓名后,我需要去请求后台,校验一下数据库中是否重名,如果没有 ajax,那么只能通过跳转进行后端访问,这个体验太糟糕了。
我们想的是:能否不需要刷新页面就可以访问后台接口?所以 Ajax 应运而生。
实例:验证用户名输入根据刚才的场景,我们来写一下代码。顺便简单介绍 Ajax 的使用
前端:
首先新建一个 XMLHttpRequest 对象
1let xhr = new XMLHttpRequest();
然后配置请求参数 xhr.open();,其中 true 是异步,false 是同步,后面会说到
1xhr.open("get", "/checkUserName", true); //true是异步,false是同步
接着接受返还值
123xhr.onload = function () ...
【前端42_存储】客户端的储存:Cookie、LocalStorage、SessionStorage
Cookie服务端 (Koa)存储:
123ctx.cookies.set("isLogin", md5(username + pwd), { maxAge: 1000 * 60 * 60 * 24 * 7,});
读取:
1const cookieVal = ctx.cookies.get("isLogin");
客户端1234567// 存储document.cookie = "myCookie=hello;Max-Age=3600";// 读取console.log(document.cookie);// myCookie=hello; myCookie2=hello2// 如果有多个 Cookie 它会用分号隔开,中间会有个空格
这样存储或者读取比较麻烦,可以自己封装一个方法
12345678910111213141516171819const getCookie = (key) => { const cookieData = document.cookie; con ...
【前端41_实时消息】实现方式:前端轮询、后端轮询(SSE)、Websocket、socket.io
目标 + 分析需求目标是做一个实时聊天的工具
那么我们就要解决问题了啊:如何保证消息实时更新呢?
我们可以不断地发送请求,来实时获取最新数据,从而铺到页面上,这就有几种方法
前端轮询
建立长链接(前后端一直连接着,有消息更新了,后台就告诉给前台)
等等…
我们先根据这几个思路学习些新东西
前端轮询:不推荐这个就比较低级了,在前端可以写个定时器,里面写请求,前端来不断的发送请求给后端
弊端就很多啦:能把页面给搞垮掉了!!
后端轮询:SSE简介全称 server send event,这个比前端轮询能好一点,主要的工作都交给后端啦,当然也需要前端的配合。
实现思路:后端不断的发送数据给前端,建立长链接
这里选择用原生来写 SSE我们知道,node 原生的话会有 res,write(), res,end(),如果要建立长链接的话,就不能结束掉链接,也就是不能 res.end(),然而 Koa 中返还的方式是 koa-body ,里面是 koa 封装的,使用的话会有些问题。
具体操作后端设置头部,从而建立长链接 ,例如: res.setHeader("Conte ...
【前端40_ MVC】项目规划、路由拆分、控制拆分、文件上传
MVC目的这一章主要学习 MVC 的思想以及如何拆分功能,把项目变得清晰,因为是思想,所以我就不怎么放代码块了,直接截图~
目的就是把项目抽离和整理成如下三层:
model:模型层 ,负责数据访问
view:视图层,负责视图呈现
controller:控制层,负责消息处理
全篇都贯穿一个思想的问题哈,这只是一个思路,我也是通过简单的案例,来了解一个较完整的项目是如何合理化构建的~
(其实我觉的这个项目例子也不是很好,后台控制页面完全可以独立出来,没必要写什么new 啊 admin 啊这些文件夹的)
至于如何处理?最佳实践又是啥?需要多做项目,实践总结。
开始!首先看看主入口文件 app.js
可以看到原先把路由之类的都写在主入口文件里了,实在是杂乱,现在要根据 MVC 的思想进行拆分。
拆分路由首先在根目录下新建一个 router.js ,然后把 app.js 中关于路由的东西都给抽离出来
拆分的过程中会遇到一个问题:如何在 router.js 模块中拿到 实例app 呢?
思路就是从 app.js 中传过来!然后再 router.js 中接收到就可以啦!
思路有了,实现一 ...
【前端39_数据库】数据库基础、Node 中链接数据库并使用
数据库为什么要用数据库数据持久化保存,如果用文件保存的话,增删查改的话会比较费劲
下载官网
基本操作建立表我去之前连建表都没写,淦!写的笔记也太不完善了。
今年建表遇到个问题我用navcat 去修改数据也会报错
这说明是建数据库的时候数据集设置的不对。
我尝试了在原有的 database 上修改数据集,但是还是不可以输入中文,无奈只能删掉数据库重新建表
12utf8;utf8_general_ci;
增:INSERT INTO1234567891011INSERT INTO 表名(字段一,字段二,字段三) VALUES ("值一","值二",值三);// 举例1INSERT user (username,pwd,age,sex) VALUES ('李四',123,28,'男');// 举例2 node 中// 注意:// - 占位符的逗号别是中文的,否则会报错 mysql 的语法错误const [rows_insert] = await connection .promise() ...
【前端38_模板引擎】pug、nunjunks
模板引擎动态生成 html 的工具,模板引擎有很多,这里介绍几个,其他的类似,原理都类似的。
pug安装我们可以通过 npm i pug 来安装
服务器脚本123456789101112131415161718192021222324252627// index.jsconst Koa = require("koa");const Router = require("koa-router");const views = require("koa-views");let app = new Koa();let router = new Router();app.use( views(__dirname + "/views", { map: { html: "pug", }, }));router.get("/", async (ctx) => { // ctx.body = &quo ...
Node 中的 export 和 module.export 的区别
前言
最新在学习 Node,学到模块化,变量导出的时候可以用如下几个方法
123456// 第一种方法:把变量包裹在对象中,并把对象赋值给 module.exportsmodule.exports = { a}// 第二种方法:把变量挂在 export 上exports.a = 1;
那么问题来了,如果我这样做呢?
1234const a = 1;exports = { a}
打印的结果如下,看来 直接修改 export 是不行的,那么为什么?
我的疑问:为什么修改了export 的值,变量不能导出呢?探索过程首先找了很多博客,看不懂😌..
索性换了google,搜到了一篇博文,其中的这三句话非常有用:
module.exports 初始值为一个空对象 {}
exports 是指向 module.exports 的一个引用,(缩句:exports 是个引用)
require() 返回的是 module.exports 而不是 exports(关键)
所以关键是module.exports 的值改了没?你改export ...
【前端37_Node 服务】Node 原生、Koa 框架
前言又来写点了,之前玩物丧志,然后跳槽,搬家,安顿,比较折腾了,没怎么学习和记笔记,哈哈哈哈
Node 原生创建一个服务:Hello Node.js首先起一个简单的服务,新建一个 js文件,写入以下命令,并用 node xx.js 运行起来,之后在浏览器中访问 本地 3000 端口。
12345678// 导入内置模块 httpconst http = require("http");// 创建服务const server = http.createServer((req, res) => { res.end("hello Node.js");});// 启动服务,监听 3000 端口server.listen(3000);
支持中文:设置 setHeader如果我返回一些中文,之后页面会出现如下乱码
12345const http = require("http");const server = http.createServer((req, res) => { res. ...