xxxxxxxxxx今日课程,一共三章:CORS解决跨域,JSONP解决跨域,mysql数据库入门;
网络通讯三要素:协议,ip(域名),端口;
xxxxxxxxxx同源:三个都相同就是同源;跨域:三个之中有一个不相同就是跨域;(http/https/file...注意点)
xxxxxxxxxx// 第一步:下载: npm i cors@2.8.5// 第二步:导入const cors = require("cors");// 第三部:配置全局中间件app.use(cors())Access-Control-Allow-Origin
设置哪些 ip 或者 域名,跨域访问该服务接口。
(值一般为具体的域名或者 ip 或者 * , * 代表允许所有地址跨域访问)
Access-Control-Allow-Headers
设置允许的跨域请求的头信息;
(默认只允许九个,这九个之外的需要单独设置,content-type属性只支持三个值,* 可以支持所有)
Access-Control-Allow-Methods
设置允许的请求方法,默认只有三个,GET/POST/HEAD;
(默认支持三个请求方法,使用 * 可以支持所有)
注意:cors 模块底层设置的头信息不止这三个;
简单请求:请求方法是三个默认请求方式之一,且请求头在默认允许的九个之内;
特点:发送一次请求;
预检请求:请求方法是三个默认请求方式之外,或者求头存在不在默认允许的九个头信息之内的其他请求头;
特点:发送两次请求,其中第一次是一次预见测试,没有具体的数据,查看是否允许发送此类请求;
jquery 发送jsonp请求:
xxxxxxxxxx$.ajax({ // method: 'get',// 所有的jsonp请求都是get请求,所以这个属性可以不写了 // data: , // 写了以后太繁琐,取消 url: 'http://www.liulongbin.top:3006/api/jsonp', // 最重要的属性 dataType: "jsonp", success: function (res) { console.log(res) }})客户端代码原理:通过创建 script 标签,设置src属性,完成跨域的请求;参数写到 路径中 问号的后面,有一个必传的参数 callback,传递的是函数的名字,将来要调用!
x// 1.封装一个jsonp函数;jsonp({ // method: 'get',// 所有的jsonp请求都是get请求,所以这个属性可以不写了 url: 'http://www.liulongbin.top:3006/api/jsonp', // data: , // 写了以后太繁琐,取消 success: function (res) { console.log(res) }})// 封装function jsonp(obj) { // 1.创建一个script标签; 2.改变src 3.给函数起名字,定义为全局函数; var script = document.createElement("script"); // 不要用innerHTML, 他不会自动发送请求 // 3.给函数起名字,定义为全局函数; var fnName = "lvchao_1231235345456456243"; // window.aaa就是把aaa设置为全局变量! window[fnName] = obj.success; // 2.改变src,添加到head中 script.src = obj.url + "?callback="+fnName+"&name=zs&age=18"; // 把script标签添加到head标签中,就会发送src的请求了 document.head.appendChild(script); // 代码执行完毕,把script标签删除 script.onload = function () { document.head.removeChild(script); }}
代码写道 cors 中间件之前;(写道 cors 中间件之后,起作用的就是 cors 中间件了)
请求方法必须使用GET,路径 /api/jsonp,一定要加 /api,因为后面的路由对于这个jsonp请求现在还不起作用;未来也未必起作用,因为我们不会把这个请求写道路由中!
具体代码:
xxxxxxxxxx// 注意: jsonp要写到cors之前;app.get("/api/jsonp", (req, res) => { // 获取函数名,设置对象,发送给客户端 const fnName = req.query.callback; // 定义发送给客户端的对象转换为json字符串 var objStr = JSON.stringify({ name: '张三', age: 18 }); // 字符串类型的执行函数 res.send(`${fnName}(${objStr})`);});市面上有很多数据库,最常见的有四个,分为两类:


准备工作:创建数据库,创建表,设置字段格式和特殊标识,添加数据(验证表是否创建成功);sql 语句:执行增删改查,让我们程序员能够更加简单有效的操作数据库:
xxxxxxxxxx-- 通过 * 把 users 表中所有的数据查询出来select * from users-- 从 users 表中把 username 和 password 对应的数据查询出来-- select username, password from usersxxxxxxxxxx-- 向 users 表中,插入新数据,username 的值为 tony stark password 的值为 098123insert into users (username, password) values ('tony stark', '098123')-- select * from usersxxxxxxxxxx-- 将 id 为 4 的用户密码,更新成 888888update users set password='888888' where id=4-- select * from users-- 更新 id 为 2 的用户,把用户密码更新为 admin123 同时,把用户的状态更新为 1update users set password='admin123',status=1 where id=2-- select * from usersxxxxxxxxxx-- 删除 users 表中, id 为 4 的用户delete from users where id=2-- select * from usersxxxxxxxxxx-- 演示 where 子句的使用select * from users where status=1select * from users where username!='ls'xxxxxxxxxx-- 使用 AND 来显示所有状态为0且id小于3的用户select * from users where status=0 and id<3-- 使用 or 来显示所有状态为1 或 username 为 zs 的用户select * from users where status=1 or username='zs'xxxxxxxxxx-- 对users表中的数据,按照 status 字段进行升序排序select * from users order by status-- 按照 id 对结果进行降序的排序 desc 表示降序排序 asc 表示升序排序(默认情况下,就是升序排序的)select * from users order by id desc-- 对 users 表中的数据,先按照 status 进行降序排序,再按照 username 字母的顺序,进行升序的排序select * from users order by status desc, username asc-- 使用 count(*) 来统计 users 表中,状态为 0 用户的总数量select count(*) from users where status=0-- 使用 AS 关键字给列起别名select count(*) as total from users where status=0select username as uname, password as upwd from users