Mongodb
简介
- Mongodb是什么
MongoDB是一个基于分布式文件存储的数据库,官方地址https://www.mongodb.com
- 数据库是什么
数据库(DataBase)是按照数据结构来组织、存储和管理数据的应用程序 - 数据库的作用
数据库的主要作用就是管理数据 ,对数据进行增©、删(d)、改(u)、查® - 数据库管理数据的特点
相比于纯文件管理数据,数据库管理数据有如下特点:
- 速度更快
- 扩展性更强
- 安全性更强
- 为什么选择Mongodb
操作语法与JavaScript类似,容易上手,学习成本低
核心概念
Mongodb中有三个重要概念需要掌握
- 数据库(database)
数据库是一个数据仓库,数据库服务下可以创建很多数据库,数据库中可以存放很多集合 - 集合(collection)
集合类似于JS中的数组,在集合中可以存放很多文档 - 文档(document)文档是数据库中的最小单位,类似于js中的对象
大家可以通过JSON文件来理解Mongodb中的概念 - 一个JSON文件 好比是一个数据库,一个Mongodb服务下可以有N个数据库
- JSON文件中的一级属性的数组值 好比是集合
- 数组中的对象好比是文档
- 对象中的属性有时也称之为字段
一般情况下 - 一个项目使用一个数据库
- 一个集合会存储同一种类型的数据
下载安装与启动
下载地址:https:/www.mongodb.com/try/download/community
建议选择zip
类型,通用性更强
配置步骤如下:
- 将压缩包移动到
C:\Program Files
下,然后解压 - 创建
C:\data\db
目录,mongodb会将数据默认保存在这个文件夹 - 以mongodb中bin目录作为工作目录,启动命令行
- 运行命令
mongodb
看到最后的waiting for connections
则表明服务已经启动成功
注意:
为了方便后续方便使用mongod命令,可以将bin目录配置到环境变量Path中
千万不要选中服务端窗口的内容 ,选中会停止服务,可以敲回车取消选中
命令行交互
命令行交互一般是学习数据库的第一步,不过这些命令在后续用的比较少,所以大家了解即可
数据库命令
- 显示所有的数据库
show dbs
- 切换到指定的数据库,如果数据库不存在会自动创建数据库
use数据库名
- 显示当前所在的数据库
选择语言
db
- 删除当前数据库
use库名 db.dropDatabase()
集合命令
- 创建集合
db.createCollection('集合名称')
- 显示当前数据库中的所有集合
show collections
- 删除某个集合
db.集合名.drop()
- 重命名集合
db.集合名.renameCollection('newname')
文档命令
- 插入文档
db.集合名.insert(文档对象);
- 查询文档
db.集合名.find(查询条件)
_id是mongodb自动生成的唯一编号,用来唯一标识文档 - 更新文档
db.集合名.update(查询条件,新的文档) db.集合名.update({name:'张三'},{$set:{age:19}})
- 删除文档
db.集合名.remove(查询条件)
应用场景
- 新增
- 用户注册
- 发布视频
- 发布商品
- 发朋友圈
- 发评论
- 发微博
- 发弹幕
- 删除
- 删除评论
- 删除商品
- 删除文章
- 删除视频
- 删除微博
- 更新
- 修改商品价格
- 修改文章内容
- 查询
- 商品列表
- 视频列表
- 朋友圈列表
- 微博列表
- 搜索功能
Mongoose
介绍
Mongoose是一个对象文档模型库,官网http://www.mongoosejs.net/
作用
方便使用代码操作mongodb数据库
使用流程
javascript
//1.安装mongoose
//2.导入mongoose
const mongoose= require('mongoose');
//3.连接数据库
mongoose.connect('mongodb://127.0.0.1:27017/bilibili');
//4.设置连接回调
//连接成功
mongoose.connection.on('open',()=>
console.log('连接成功');
//5.创建文档结构对象
let BookSchema= new mongoose.Schema({
title:String,
author:String,
price:Number
})
字段类型
文档结构可选的常用字段类型列表
类型 | 描述 |
---|---|
String | 字符串 |
Number | 数字 |
Boolean | 布尔值 |
Array | 数组,也可以使用[]来标识 |
Date | 日期 |
Buffer | Buffer对象 |
Mixed | 任意类型,需要使用mongoose.Schema.Types.Mixed 指定 |
Objectld | 对象ID,需要使用mongoose.Schema.Types.ObjectId 指定 |
Decimal128 | 高精度数字,需要使用mongoose.Schema.Types.Decimal128 指定 |
字段值验证
Mongoose有一些内建验证器,可以对字段值进行验证
- 必填项
title:{ type:String, required:true//设置必填项 }
- 默认值
author: type:String, default:'匿名'//默认值 }
, - 枚举值
gender: type:String, enum:['男','女']//设置的值必须是数组中的 }
, - 唯一值
username: type:String },
unique需要重建集合才能有效果
条件控制
- 运算符
在mongodb不能 > < >= <= !==等运算符,需要使用替代符号
>
使用$gt
<
使用$lt
>=
使用$gte
<=
使用$lte
!==
使用$ne
db.students.find({id:{$gt:3});id号比3大的所有的记录
- 逻辑运算
$or
逻辑或的情况
db.students.find({$or:[{age:18},{age:24)]});
KaTeX parse error: Expected '}', got 'EOF' at end of input: ...students.find({and:[{age:{KaTeX parse error: Expected '}', got 'EOF' at end of input: lt:20)),{age:{gt:15))]});` - 正则匹配
条件中可以直接使用JS的正则语法,通过正则可以进行模糊查询
个性化读取
- 字段筛选
//0:不要的字段 //1:要的字段 SongModel.find().select({_id:0,title:1}).exec(function(err,data){ if(err)throw err; console.log(data); mongoose.connection.close(); });
- 数据排序
//sort排序 //1:升序 //-1:倒序 SongModel.find().sort({hot :1)).exec(function(err,data){ if(err)throw err; console.log(data); mongoose.connection.close() })
- 数据截取
//skip跳过 limit限定 SongModel.find().skip(10).limit(10).exec(function(err,data){ if(err)throw err; console.log(data);
图形化管理工具
我们可以使用图形化的管理工具来对Mongodb进行交互,这里演示两个图形化工具
- Robo3T,免费
https://github.com/Studio3T/robomongo/releases
- Navicat,收费
https://www.navicat.com.cn/
接口
简介
- 接口是什么
接口是前后端通信的桥梁
简单理解:一个接口就是服务中的一个路由规则 ,根据请求响应结果
接口的英文单词是API(Application Program Interface),所以有时也称之为API接口
这里的接口指的是『数据接口」,与编程语言(Java,Go等)中的接口语法不同 - 接口的作用
实现前后端通信 - 接口的开发与调用
大多数接口都是由后端工程师 开发的,开发语言不限
一般情况下接口都是由前端工程师 调用的,但有时后端工程师也会调用接口,比如短信接口,支付接口等 - 接口的组成
一个接口一般由如下几个部分组成
- 请求方法
- 接口地址(URL)
- 请求参数
- 响应结果
一个接口示例https://www.free-api.com/doc/325
RESTful API
RESTful API是一种特殊风格的接口,主要特点有如下几个:
- URL中的路径表示资源 ,路径中不能有动词 ,例如
create
,delete
,update
等这些都不能有 - 操作资源要与HTTP请求方法对应
- 操作结果要与HTTP响应状态码 对应
规则示例:
操作 | 请求类型 | URL | 返回 |
---|---|---|---|
新增歌曲 | POST | /song | 返回一个空文档 |
删除歌曲 | DELETE | /song/10 | 返回新生成的歌曲信息 |
修改歌曲 | PUT | /song/10 | 返回更新后的歌曲信息 |
修改歌曲 | PATCH | /song/10 | 返回更新后的歌曲信息 |
获取所有歌曲 | GET | /song | 返回歌曲列表数组 |
获取单个歌曲 | GET | /song/10 | 返回单个歌曲信息 |
扩展阅读:https:/www.ruanyifeng.com/blog/2014/05/restful_api.html |
json-server
json-server本身是一个JS编写的工具包,可以快速搭建RESTful API服务
官方地址:https:/github.com/typicode/json-server
操作步骤:
- 全局安装json-server
npm i -g json-server
- 创建JS0N文件(db.json),编写基本结构
{ "song":[ {"id":1,"name":"干杯","singer":"五月天"}, {"id":2,"name":"当","singer":"动力火车"}, {"id":3,"name":"不能说的秘密","singer":"周杰伦"} ]}
- 以JSON文件所在文件夹作为工作目录 ,执行如下命令
json-server --watch db.json
默认监听端口为3000
接口测试工具
介绍几个接口测试工具
- apipost
https://www.apipost.cn
(中文) - apifox
https://www.apifox.cn/
(中文) - postman
https://www.postman.com/
(英文)
会话控制
介绍
所谓会话控制就是对会话进行控制
HTTP是一种无状态的协议,它没有办法区分多次的请求是否来自于同一个客户端,无法区分用户
而产品中又大量存在的这样的需求,所以我们需要通过会话控制 来解决该问题
常见的会话控制技术有三种:
- cookie
- session
- token
cookie
- cookie是什么
cookie是HTTP服务器发送到用户浏览器并保存在本地的一小块数据
cookie是保存在浏览器端的一小块数据
cookie是按照域名划分保存的
简单示例:
域名 | cookie |
---|---|
www.baidu.com |
a=100;b=200 |
www.bilibili.com |
xid=1020abce121;hm=112411213 |
jd.com |
x=100;ocw=12414cce |
- cookie的特点
浏览器向服务器发送请求时,会自动将当前域名下 可用的cookie设置在请求头中,然后传递给服务器,这个请求头的名字也叫cookie
,所以将cookie理解为一个HTTP的请求头也是可以的 - cookie的运行流程
- 浏览器操作cookie
浏览器操作cookie的操作,使用相对较少,大家了解即可 - 禁用所有cookie
- 删除cookie
- 查看cookie
session
- session是什么
session是保存在服务器端的一块儿数据,保存当前访问用户的相关信息 - session的作用
实现会话控制,可以识别用户的身份,快速获取当前用户的相关信息 - session运行流程
填写账号和密码校验身份,校验通过后创建session信息 ,然后将session_id
的值通过响应头返回给浏览器
- session的代码操作
javascript
express中可以使用express-session对session进行操作
const express= require('express');
//1.安装包npm i express-session
connect-mongo
//2.引入express-session connect-mongo
const session =require("express-session");
const MongoStore =require('connect-mongo');
const app= express();
//3.设置session的中间件
app.use(session({
name: 'sid',//设置cookie的name,默认值是:connect.sid
secret: 'atguigu',//参与加密的字符串(又称签名)
saveUninitialized: false,//是否为每次请求都设置一个cookie用来存储session的id
resave: true,//是否在每次请求时重新保存session
store: MongoStore.create({
mongoUrl: 'mongodb://127.0.0.1:27017/project'//数据库的连接配置
}),
cookie: {
http0nly: true,//开启后前端无法通过JS操作
maxAge: 1000 * 300//这一条是控制sessionID的过期时间的!!!
},
}))
//创建session
app.get('/login',(req,res)=>
//设置session
session和cookie的区别
cookie和session的区别主要有如下几点:
- 存在的位置
- cookie:浏览器端
- session:服务端
- 安全性
- cookie是以明文的方式存放在客户端的,安全性相对较低
- session存放于服务器中,所以安全性相对较好
- 网络传输量
- cookie设置内容过多会增大报文体积,会影响传输效率
- session数据存储在服务器,只是通过cookie传递id,所以不影响传输效率
- 存储限制
- 浏览器限制单个cookie保存的数据不能超过4K,且单个域名下的存储数量也有限制
- session数据存储在服务器中,所以没有这些限制
token
token是什么
token
是服务端生成并返回给HTTP客户端的一串加密字符串,token
中保存着用户信息
token的作用
实现会话控制,可以识别用户的身份,主要用于移动端APP
token的工作流程
填写账号和密码校验身份,校验通过后响应token,token一般是在响应体中返回给客户端的
token的特点
- 服务端压力更小
- 数据存储在客户端
- 相对更安全
- 数据加密
- 可以避免CSRF(跨站请求伪造)
- 扩展性更强
- 服务间可以共享
- 增加服务节点更简单
JWT
JWT(JSON Web Token)是目前最流行的跨域认证解决方案,可用于基于token
的身份验证
JwT使token的生成与校验更规范
我们可以使用jsonwebtoken包
来操作token
javascript
//导入jsonwebtokan
const jwt= require('jsonwebtoken');
//创建token
//jwt.sign(数据,加密字符串,配置对象)
let token =jwt.sign({
username:'zhangsan'
},'atguigu',{
expiresIn:60//单位是秒
})
//解析token
jwt.verify(token,'atguigu',(err,data)=>{
if(err){
console.log('校验失败~');
return
}
console.log(data);
})
本地域名
本地域名的定义
所谓本地域名就是只能在本机使用的域名,一般在开发阶段使用
操作流程
编辑文件C:\Windows\System32\drivers\etc\hosts
127.0.0.1 www.baidu.com
如果修改失败,可以修改该文件的权限
原理
在地址栏输入域名 之后,浏览器会先进行DNS(Domain Name System)查询,获取该域名对应的IP地址
请求会发送到DNS服务器,可以根据域名返回IP地址
可以通过ipconfig/all
查看本机的DNs服务器
hosts
文件也可以设置域名与P的映射关系,在发送请求前,可以通过该文件获取域名的P地址
HTTPS
https本意是http+SSL(Secure Sockets Layer安全套接层)
https可以加密HTTP报文 ,所以大家也可以理解为是安全的HTTP
工具官网:https/certbot.eff.org/
操作流程:
- 下载工具
https://dl.eff.org/certbot-beta-installer-win_amd64.exe
- 安装工具
- 管理员运行命令
certbot certonly-standalone
- 代码配置如下
const https= require('https'); https .createServer( key:fs.readFileSync('/etc/letsencrypt/path/to/key.pem'), cert:fs.readFileSync('/etc/letsencrypt/path/to/cert.pem'), ca:fs.readFileSync('/etc/letsencrypt/path/to/chain.pem'), }, app .listen(443,()=>{ console.log('Listening...') })