数据库

数据库管理系统(数据库):为了方便管理互联网世界中的数据,用户可以对数据库中的数据进行新增、查询、更新、删除等操作。用来组织、存储和管理数据的仓库。

常见数据库:

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. 前端开发学习笔记 - 1. Node.JS安装笔记

    Node.JS安装笔记 Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an ...

  2. node.js学习笔记

    # node.js学习笔记标签(空格分隔): node.js---## 一 内置模块学习 ### 1. http 模块 ``` //1 导入http模块 const http =require('ht ...

  3. node.js学习笔记14—微型社交网站

    node.js学习笔记14-微型社交网站 1.功能分析 微博是以用户为中心,因此需要有注册和登录功能. 微博最核心的功能是信息的发表,这个功能包括许多方面,包括:数据库访问,前端显示等. 一个完整的微 ...

  4. Node.js学习笔记8

    Node.js学习笔记8 HTTP服务器与客户端 Node.js的http模块,封装了一个高效的HTTP服务器和一个简易的HTTP客户端 http.server是一个基于事件的HTTP服务器,核心由N ...

  5. node.js学习笔记5——核心模块1

    node.js学习笔记5--核心模块1 Node.js核心模块主要内容包括:(1)全局对象 (2)常用工具 (3)事件机制 (4)文件系统访问 (5)HTTP服务器与客户端 一: 全局对象 Node. ...

  6. Node.js初学笔记

    Node.js初学笔记 Node.js学习笔记,包括原生模块.Express框架.Koa框架的基本使用.以及基于Koa项目的搭建以及Postman接口测试和一些使用技巧. Node.js http模块 ...

  7. node.js 学习笔记(二)模板引擎和C/S渲染

    node.js 学习笔记(二)模板引擎和C/S渲染 文章目录 node.js 学习笔记(二)模板引擎和C/S渲染 一.初步实现Apache功能 1.1 使用模板引擎 1.2 在 node 中使用模板引 ...

  8. 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 ...

  9. 千锋Node.js学习笔记

    千锋Node.js学习笔记 文章目录 千锋Node.js学习笔记 写在前面 1. 认识Node.js 2. NVM 3. NPM 4. NRM 5. NPX 6. 模块/包与CommonJS 7. 常 ...

最新文章

  1. ISDN,俗称一线通!
  2. Spring IOC实现
  3. vFORUM十大“最”看点,带你“撩”会议
  4. asp.net缓存(二)
  5. ARM 寄存器 详解
  6. springboot pom 依赖
  7. 蓝桥杯第八届省赛JAVA真题----迷宫
  8. 不使用第三个变量交换两个变量
  9. 【JZOJ】【数论】立体井字棋
  10. latex,希腊字母,英文花体字
  11. 软件测试工程师APUS一面二面汇总
  12. 边境的悍匪—机器学习实战:第十七章 使用自动编码器和GAN的表征学习和生成学习
  13. ESP8266 NodeMCU驱动OLED屏(SSD1306,4PIN,IIC)
  14. Git使用教程之初级入门命令行(二)
  15. 转!!以太网方案设计
  16. 对待金融创新,央行应持更开明态度
  17. 计算机上安装了更新ie版本,电脑XP系统安装不了ie提示“安装了更新的Internet Explorer版本”的解决方法...
  18. win2019服务器版游戏性能,微软win10发布2019年03累积更新,修复游戏和鼠标性能卡顿等问题...
  19. C++--数值的整数次方
  20. 场景:一个年级,相当链表A ,该年级5个班,每个班5个人,相当于链表B1--B5:做一个学生成绩管理系统学生成绩有语文 数学 英语功能: 录入成绩 找三科总分的最高分 最低分 算出平均分

热门文章

  1. 数据库|MySQL入门大全
  2. tp的ring3层的检测机制到底是怎样的
  3. [ITSS]信息技术服务标准详解
  4. 中国计算机好的985和211大学,全国985和211高校有哪些
  5. 魔方linux使用教程,SideQuest安装使用教程
  6. 快速搜索服务器文件,最好用的文件快速搜索软件Everything官网最新版
  7. AMD 32核Zen处理器现身Geekbench 4
  8. 我在京东做研发 | 揭秘支撑京东万人规模技术人员协作的行云DevOps平台
  9. eclipse的中文化
  10. 换新手机了,如何从安卓机转到苹果?步骤示范跟着做!