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数据库
使用流程
//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日期BufferBuffer对象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/releasesNavicat,收费
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.htmljson-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是一种无状态的协议,它没有办法区分多次的请求是否来自于同一个客户端,无法区分用户
而产品中又大量存在的这样的需求,所以我们需要通过会话控制来解决该问题
常见的会话控制技术有三种:
cookiesessiontoken
cookie
cookie是什么
cookie是HTTP服务器发送到用户浏览器并保存在本地的一小块数据
cookie是保存在浏览器端的一小块数据
cookie是按照域名划分保存的
简单示例:
域名cookiewww.baidu.coma=100;b=200www.bilibili.comxid=1020abce121;hm=112411213jd.comx=100;ocw=12414ccecookie的特点
浏览器向服务器发送请求时,会自动将当前域名下可用的cookie设置在请求头中,然后传递给服务器,这个请求头的名字也叫cookie,所以将cookie理解为一个HTTP的请求头也是可以的cookie的运行流程
浏览器操作cookie
浏览器操作cookie的操作,使用相对较少,大家了解即可禁用所有cookie删除cookie查看cookie
session
session是什么
session是保存在服务器端的一块儿数据,保存当前访问用户的相关信息session的作用
实现会话控制,可以识别用户的身份,快速获取当前用户的相关信息session运行流程
填写账号和密码校验身份,校验通过后创建session信息,然后将session_id的值通过响应头返回给浏览器
session的代码操作
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
//导入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...') })