Node.js自学笔记(4)
数据库
数据库管理系统(数据库):为了方便管理互联网世界中的数据,用户可以对数据库中的数据进行新增、查询、更新、删除等操作。用来组织、存储和管理数据的仓库。
常见数据库:
MySQL数据库(Community+Enterprise),Oracle数据库,SQL Server数据库,MongoDB数据库(Community+Enterprise)。前三者为传统数据库(关系型数据库或SQL数据库),设计理念相同,用法比较类似,后者为新型数据库(非关系型数据库或NoSQL数据库)。
数据库-数据组织结构(传统型数据库)
数据组织结构:数据以什么样的结构进行存储。
Excel:工作簿、工作表、数据行、列。
传统型数据库:数据库、数据表、数据行、字段。
四者在实际开发中的联系:
1)一般情况下,每个项目都有对应独立的数据库。
2)不同的数据,要存储到数据库的不同表中。
3)每个表中具体存储哪些信息,由字段来决定。
4)表中的行,代表每一条具体的数据。
数据库-SQL
SQL:结构化查询语言,专门用来访问和处理数据库的编程语言。以编程的形式,操作数据库里面的数据,使用SQL语言编写的代码叫做SQL语句。SQL语言只能在关系型数据库中使用。
大小写不敏感。
作用:
1)从数据库中查询数据
2)向数据库中插入新的数据
3)更新数据库中的数据
4)从数据库删除数据
SELECT语句
select用于从表中查询数据,执行结构被存储在一个结果表中(称为结果集)。
SELECT * FROM 表名称
--特定列查询,多列查询用,分隔
SELECT 列名称 FROM 表名称
INSERT INTO语句
insear into用于向数据表中插入新的数据行。
--列与值一一对应,多个列和多个值间用,分隔
INSERT INTO table_name(列1,列2...) VAULES (值1,值2...)
UPDATE语句
update用于修改表中的数据。
--用UPDATE指定要更新表中的数据,用SET指定列对应的新值,用WHERE指定更新的条件
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
--多列修改
UPDATE 表名称 SET 列名称 = 新值,列名称 = 新值... WHERE 列名称 = 某值
DELETE语句
delete用于删除表中的行。
DELETE FROM 表名称 WHERE 列名称 = 值
WHERE子句
where用于限定选择的标准。
select 列名称 from 表名 where 列 运算符 值
update 表名称 set 列 = 新值 where 列 运算符 值
delete from 表名称 where 列 运算符 值
操作符 | 描述 |
---|---|
= | 等于 |
<> | 不等于,某些版本的SQL中可以写成!= |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
BETWEEN | 在某个范围内 |
LIKE | 搜索某种模式 |
AND和OR运算符
and和or可在where子语句中把两个或多个条件结合起来。
and表示必须同时满足多个条件,相当于JavaScript中的&&运算符。
or表示只要满足任意一个条件即可,相当于JavaScript中||运算符。
ORDER BY子句
order by 语句用于根据指定的列对结果集进行排序。
order by 语句默认按照升序对记录进行排序,使用DESC进行降序排序。
--升序
select * from users order by 字段名 asc
--降序
select * from users order by 字段名 desc
--多重排序
select * from users order by 字段名 desc, 字段名 asc
COUNT(*)函数
count(*)函数用于返回查询结果的总数据条数。
--as为列设置别名
select count(*) as total from 表名称
MySQL模块
在项目中操作数据库的步骤
1)安装操作MySQL数据库的第三方模块:npm i mysql
2)通过mysql模块连接到MYSQL数据库
const mysql = require('mysql')
const db = mysql.createPool({post://指定端口号host: //数据库的IP地址user: //登录数据库的账号password: //登录数据库的密码database: //指定要操作的数据库
})
3)通过mysql模块执行SQL语句
db.query('SELEST 1',(err,results) => {if(err) return console.log(err.message)
})
MySQL模块-查询数据
const sqlStr = 'select * from users'
db.query('sqlStr',(err,results) => {//select查询结果为数组console.log(results)
})
MySQL模块-插入数据
//要插入的数据
const user = { username: 'ss', password:'22' }
//待执行的SQL语句,其中英文?表示占位符
const sqlStr = 'insert into users(username, password) values(?, ?)'
//使用数组的形式,依次为?占位符指定具体的值
db.query(sqlStr, [user.username, user.password], (err, results) => {if(results.affectedRows === 1){console.log('')}
})
便捷方式:如果数据对象和每个属性和数据表的字段一一对应
const user = { username: 'ss', password:'22' }
const sqlStr = 'insert into users set ?'
db.query(sqlStr, user, (err, results) => {if(results.affectedRows === 1){console.log('')}
})
MySQL模块-更新数据
//待更新的数据对象
const user = {id = 7, username = '11', password = '22'}
const sqlStr = 'update users set username = ?, password = ? where id = ?'
db.query(sqlStr, [user.username, user.password, user.id], (err, results) => {if(results.affectedRows === 1){console.log('')}
})
便捷方式
const user = {id = 7, username = '11', password = '22'}
const sqlStr = 'update users set ? where id = ?'
db.query(sqlStr, [user, user.id], (err, results) => {if(results.affectedRows === 1){console.log('')}
MySQL模块-删除数据
const sqlStr = 'delete from users where id = ?'
db.query(sqlStr, 7, (err, results) => {if(results.affectedRows === 1){console.log('')}
})
标记删除
使用DELETE语句会把真实的数据从表中删除,推荐使用标记删除的形式,来模拟删除的动作。
用法:在表中设置类似于status这样的状态字段,来标记当前这条数据时都被删除。
const sqlStr 'update users set status = ? where id = ?'
db.query(sqlStr, [1,6], (err, results) => {if(results.affectedRows === 1){console.log('')}
})
Web开发模式-服务端渲染
服务端渲染的概念:服务器发送给客户的HTML页面,是在服务器通过字符串的拼接,动态生成的。客户端不需要使用Ajax的技术额外请求页面数据。
优点:前端耗时少、有利于SEO。
缺点:占用服务器端资源、不利于前后端分离,开发效率低。
Web开发模式-前后端分离
前后端分离的概念:前后端的开发模式,依赖于Ajax技术的广泛应用。后端只负责提供API接口,前端使用Ajax调用接口的开发模式。
优点:开发体验好、用户体验好、减轻了服务器的渲染压力。
缺点:不利于SSO。
解决方案:利用Vue、React等前端框架的SSR技术。
身份认证
身份认证(身份验证、鉴权):通过一定的手段,完成对用户身份的确认。
服务端渲染:Session认证机制
前后端分离:JWT认证机制
身份认证-Session认证机制
HTTP协议的无状态:客户端的每次HTTP请求都是独立的,连续多个请求之间没有直接的关系,服务器不会主动保留每次HTTP请求的状态。
在现实生活中的会员卡身份认证方式,在Web开发的专业术语叫做Cookie。
Cookie
Cookie是存储在用户浏览器中的一段不超过4KB的字符串。它由一个名称、一个值和其他几个用于控制Cookie有效性、安全性、使用范围的可选属性组成。
不同于名下的Cookie各自独立,每当客户端发起请求,会自动把当前域名下所有未过期的Cookie一同发送到服务器。
特性:自动发送、域名独立、过期时限、4KB限制
作用:客户端第一次请求服务器时,服务器通过响应头的形式,向客户端发送一个身份认证的Cookie,客户端会自动将Cookie保存在浏览器中;当客户端浏览器每次请求服务器时,浏览器会自动将身份认证相关的Cookie,通过请求头的形式发送给服务器,服务器即可验明客户端身份。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iL9HWJ25-1657093801321)(C:\Users\Snower\AppData\Roaming\Typora\typora-user-images\image-20220630195009458.png)]
不具有安全性:Cookie存储在浏览器中,浏览器提供读写Cookie的API,因此Cookie很容易被伪造。
在Express中使用Session认证
1)安装express-session中间件:npm i express-session
2)配置express-session中间件
//导入session中间件
var session = require('express-session')
//配置Session中间件
app.use(session({//secret的值可为任意字符串secret:'',//固定写法resave:false,savaUninitializes:true
}))
3)向session中存数据:当中间件配置成功后,可通过req.session来访问和使用session来访问和使用session对象
app.post('',(req,res) => {//user是指存储名称,不固定
req.session.user = req.body
}
4)从session中取数据:从req.session对象获取之前存储的数据。
app.get('',(req,res) => {req.send({status:0,msg:'success',username:req.session.user.username})
})
5)清空session的信息:调用req.session.destroy()函数,只会当前用户的session
req.session.destroy()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZWmt61R0-1657093801327)(C:\Users\Snower\AppData\Roaming\Typora\typora-user-images\image-20220706142920260.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TMdwHL7S-1657093801329)(C:\Users\Snower\AppData\Roaming\Typora\typora-user-images\image-20220706142942000.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Et7779Rz-1657093801330)(C:\Users\Snower\AppData\Roaming\Typora\typora-user-images\image-20220706143004136.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K08bUIGW-1657093801332)(C:\Users\Snower\AppData\Roaming\Typora\typora-user-images\image-20220706143033618.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jDBxS7rN-1657093801333)(C:\Users\Snower\AppData\Roaming\Typora\typora-user-images\image-20220706143105616.png)]
身份认证-JWT认证机制
JWT是目前最流行的跨域认证解决方案。
工作原理:用户的信息通过Token字符串,保存在客户端浏览器中。服务器通过还原Token字符串的形式来认证用户的身份。
组成部分:Header(头部)、Payload(有效荷载)、Signature(签名),三者之间使用英文.分隔。
Header、Signature:安全性相关的部分,为了保证Token的安全性
Payload:真正的用户信息
使用方式:把JWT放在HTTP请求头的Authorization字段中
Authorization:Bearer <token>
在Express中使用JWT认证
1)安装JWT相关包
//jdonwebtoken:用于生成JWT字符串,express-jwt用于将JWT字符串解析还原成JSON对象
npm i jsonwebtoken express-jwt
2)导入JWT相关包
const jwt = require('jsonwebtoken')
const expressJWT = require('express-jwt')
3)定义secret秘钥:保证JWT字符串的安全性
(1)当生成JWT字符串的时候,需要使用secret秘钥对用户的信息进行加密
const secretKey = 'awd'
(2)当把JWT字符串解析还原成JSON对象的时候,需要使用secret进解密
app.use(expressJWT({secret: secretKey}).unless({path:[/*\/api\/]}))
4)在登录成功后生成JWT字符串:调用jsonwebtoken包提供的sign(0方法,将用户的信息加密成JWT字符串。
//参数1:用户的信息对象;参数2:加密的秘钥;参数3:配置对象,可以配置当前token的有效期
const tokenStr = jwt.sign({username:userinfo.username}, secretKey, {expiresIn: '30s'})
5)使用req.user获取用户信息
//在有权限的API接口
app.get('',function(req,res){req.user
})
6)捕获解析JWT失败后产生的错误:通过Express的错误中间件
app.use((err,req,res,next)=>{if(err.name === 'UnauthorizedError'){return res.send({status:401,message:''})}
})
Node.js自学笔记(4)相关推荐
- 前端开发学习笔记 - 1. Node.JS安装笔记
Node.JS安装笔记 Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an ...
- node.js学习笔记
# node.js学习笔记标签(空格分隔): node.js---## 一 内置模块学习 ### 1. http 模块 ``` //1 导入http模块 const http =require('ht ...
- node.js学习笔记14—微型社交网站
node.js学习笔记14-微型社交网站 1.功能分析 微博是以用户为中心,因此需要有注册和登录功能. 微博最核心的功能是信息的发表,这个功能包括许多方面,包括:数据库访问,前端显示等. 一个完整的微 ...
- Node.js学习笔记8
Node.js学习笔记8 HTTP服务器与客户端 Node.js的http模块,封装了一个高效的HTTP服务器和一个简易的HTTP客户端 http.server是一个基于事件的HTTP服务器,核心由N ...
- node.js学习笔记5——核心模块1
node.js学习笔记5--核心模块1 Node.js核心模块主要内容包括:(1)全局对象 (2)常用工具 (3)事件机制 (4)文件系统访问 (5)HTTP服务器与客户端 一: 全局对象 Node. ...
- Node.js初学笔记
Node.js初学笔记 Node.js学习笔记,包括原生模块.Express框架.Koa框架的基本使用.以及基于Koa项目的搭建以及Postman接口测试和一些使用技巧. Node.js http模块 ...
- node.js 学习笔记(二)模板引擎和C/S渲染
node.js 学习笔记(二)模板引擎和C/S渲染 文章目录 node.js 学习笔记(二)模板引擎和C/S渲染 一.初步实现Apache功能 1.1 使用模板引擎 1.2 在 node 中使用模板引 ...
- Node.js基础笔记
Node.js基础笔记 1. NodeJS入门基础 1.1 NodeJS 介绍 1.1.1 NodeJS 是什么 1.1.2 NodeJS 的优势 1.1.3 NodeJS 的技术特性 1.1.4 N ...
- 千锋Node.js学习笔记
千锋Node.js学习笔记 文章目录 千锋Node.js学习笔记 写在前面 1. 认识Node.js 2. NVM 3. NPM 4. NRM 5. NPX 6. 模块/包与CommonJS 7. 常 ...
最新文章
- ISDN,俗称一线通!
- Spring IOC实现
- vFORUM十大“最”看点,带你“撩”会议
- asp.net缓存(二)
- ARM 寄存器 详解
- springboot pom 依赖
- 蓝桥杯第八届省赛JAVA真题----迷宫
- 不使用第三个变量交换两个变量
- 【JZOJ】【数论】立体井字棋
- latex,希腊字母,英文花体字
- 软件测试工程师APUS一面二面汇总
- 边境的悍匪—机器学习实战:第十七章 使用自动编码器和GAN的表征学习和生成学习
- ESP8266 NodeMCU驱动OLED屏(SSD1306,4PIN,IIC)
- Git使用教程之初级入门命令行(二)
- 转!!以太网方案设计
- 对待金融创新,央行应持更开明态度
- 计算机上安装了更新ie版本,电脑XP系统安装不了ie提示“安装了更新的Internet Explorer版本”的解决方法...
- win2019服务器版游戏性能,微软win10发布2019年03累积更新,修复游戏和鼠标性能卡顿等问题...
- C++--数值的整数次方
- 场景:一个年级,相当链表A ,该年级5个班,每个班5个人,相当于链表B1--B5:做一个学生成绩管理系统学生成绩有语文 数学 英语功能: 录入成绩 找三科总分的最高分 最低分 算出平均分