mongodb的概念&安装
1.注意安装完后要在
$ sudo mkdir -p /data/db
根目录中创建这个文件
参考链接
2.检查是否安装成功
终端输入 which mongod
会显示出/usr/local/bin/mongod
mongodb可视化工具RoBo 3T安装及应用
1.运行命令,终端输入
mongod
//最后会输出waiting for connections on port 27017
//说明启动成功,在监听27017端口
2.打开可视化工具之前要终端启动,不然工具连接不到本地的数据库
mongoose的作用
中文文档
https://mongoose.shujuwajue.com/
mongoose的应用和概念
1.用mongoose去操作mongodb是非常简单的,比原生的简单。
2.范式,可以理解为就是描述你这个数据表,之前学数据库是不是要先建表,是不是要确定有那些数据,需要那些字段,每个字段的格式等等,那么在mongoose中是不需要你手动去创建这个表,他只是用代码去描述这种模型,所以叫schemas模式。
2.模型models,由schemas发布生成的一个模型,里面具备一个抽象的行为,比如想对数据库的增删改查,是模型去操作的。这个模型是mongoose本身写好的。实体也叫实例,跟你数据库创建的那个表关联的,通过这个实例可以对这个表的读写能力。
3.schemas有几种类型,比如新建一个字段,有这个字段的类型约束他。常规类型:(String,Number,Date,Buffer,Boolean,Mixed,Objectid,Array),还支持自定义类型。
编译你的第一个模型
var schema = new mongoose.Schema({ name: 'string', size: 'string' });
var Tank = mongoose.model('Tank', schema);
4.在koa2脚手架用mongoose首先要
//1.进入项目目录
npm i mongoose
//2.创建用一个目录
mkdir dbs
//3.进入当前目录
cd dbs/
//4.新建config.js文件
touch config.js
//5.内容如下
// export default({
// //在这个数据库下新建了一个数据库叫dbs
// dbs:'mongodb://127.0.0.1:27017/dbs'
// }) es6
module.exports = {
//在这个数据库下新建了一个数据库叫dbs
dbs:'mongodb://127.0.0.1:27017/dbs'
}
//6.再创建一个models
mkdir models
//7.创建一个类型,存储人相关的数据类型
touch models/person.js
//8.内容如下
//dbs/models/person.js/这个命名就是你数据库表的名字
// import mongoose from 'mongoose' es6
const mongoose = require('mongoosen')
//等于建表,通过代码去描述
let personSchema = new mongoose.Schema({
name:String,
age:Number
})
//导出这张描述的数据表,模型和Schema关联导出
// export default mongoose.model('Person',personSchema) es6
module.exports = mongoose.model('Person',personSchema)
//9.在app.js填写以下内容
//第一步引入mongoose
const mongoose = require('mongoose')
const dbConfig = require('./dbs/config')
//连接mongd数据库
mongoose.connect(dbConfig.dbs,{
useNewUrlParser:true
})
//强调注意!!!如果没有数据的话,你运行了程序,但是可视化工具里面还是会看不到东西的,因为没有数据不会显示
//上面注释的es6 是因为这个koa脚手架没有引入babel,所以用es6会报错
5.编辑一个接口新增数据
//1.routes/users.js路由里面新增一个方法
//首先要把这个模型引进来,建立一个实例
const Person = require('../dbs/models/person')
//2.编写接口
//定义一个post的新增接口
router.post('/addPerson',async function (ctx, next) {
const person = new Person({
name:ctx.request.body.name,
age:ctx.request.body.age
})
let code
try {
//存进数据库
await person.save()
code = 0
} catch (error) {
code = 1
}
//返回一个接口,如果直接返回,无论存进去对和错都会返回0,所以要捕获错误
ctx.body = {
code:code
}
})
//测试的话可以用命令行
curl -d 'name=lilei&age=27' http://localhost:3000/users/addPerson
//返回结果应该是
{
"code": 0
}
//再次查看数据库就会有记录了
//3.继续编写查询接口
//定义一个post的查询接口
router.post('/getPerson',async function (ctx, next) {
const result = await Person.findOne({name:ctx.request.body.name})//查到一个就停止
const results = await Person.find({name:ctx.request.body.name})//查到出来是一个集合
//返回一个接口,如果直接返回,无论存进去对和错都会返回0,所以要捕获错误
ctx.body = {
code:0,
result,
results
}
})
//请求
curl -d 'name=lilei' http://localhost:3000/users/getPerson
//返回
{
"code": 0,
"result": {
"_id": "5cd63b0a773dcf71ee29fa21",
"name": "lilei",
"age": 27,
"__v": 0
},
"results": [
{
"_id": "5cd63b0a773dcf71ee29fa21",
"name": "lilei",
"age": 27,
"__v": 0
}
]
}
//4.修改接口
//定义一个post的修改接口
router.post('/updatePerson',async function (ctx, next) {
const result = await Person.where({
name:ctx.request.body.name
}).update({
age:ctx.request.body.age
})//查到一个就停止
ctx.body = {
code:0
}
})
//请求
curl -d 'name=lilei&age=11' http://localhost:3000/users/updatePerson
//返回
{
"code": 0
}
//5.编写删除接口
//定义一个post的删除接口
router.post('/removePerson',async function (ctx, next) {
const result = await Person.where({
name:ctx.request.body.name
}).remove()//查到一个就停止
ctx.body = {
code:0
}
})
//请求
curl -d 'name=lilei' http://localhost:3000/users/removePerson
//返回
{
"code": 0
}
redis
命令行启动服务
redis-server
1.用redis存储session,如果直接用服务器的session会把内存很快爆满,如果用数据库存储要考虑读写性能
2.操作是key,value非常简单
3.koa操作session和redis
npm i koa-generic-session koa-redis
4.引入模块
//1.引入session和redis
const session = require('koa-generic-session')
const Redis = require('koa-redis')
//1.连接
app.keys=['keys','keyskyes'] //加密的,随便写2个单词也行
//要把seesion的中间件用起来
app.use(session({
store:new Redis() //默认不指定是使用内存
}))
5.在middleware/koa-pv.js,中间件使用redis存储session
function pv(ctx){
ctx.session.count++
global.console.log('pv',ctx.path)
}
module.exports=function(){
return async function(ctx,next){
pv(ctx)
await next()
}
}
//app.js要使用这个中间件然后刷新页面就可以存到session进redis
6.客户端查看
//连接
redis-cli
//查看当前所有
keys *
//获取当前key的值
get (value)
7.在接口中使用redis,就是不一定要配合session使用,如果需要读取比较快的数据也可以这样直接操作redis存储
//routes目录下的users.js定义下面内容
//引入redis
const Redis = require('koa-redis')
const Store = new Redis().client
//定义一个redis的新增接口
router.get('/fix',async function(ctx){
const st = await Store.hset('fix','name',Math.random())
ctx.body={
code:0
}
})
//测试
curl http://localhost:3000/users/fix
//redis客户端获取
hget fix name