mongodb的安装
安装好mongodb和Robo3T, 并开启mangodb的服务。
cd koa2-learn
在根目录下检录dbs文件夹,并创建配置文件。
npm i mongoose
mkdir dbs
touch config.js
config.Js 文件内容如下:
module.exports = {
'dbs': 'mongodb://127.0.0.1:27017/dbs'
}
新建module, 创建schema
mkdir modules
touch modules/person.js
person.js 文件如下:
import mongoose from 'mongoose'
let personSchema = new mongoose.Schema({
name: String,
age: Number
})
module.exports = mongoose.module('person', personSchema)
最后,在app.js连接数据库
const mongoose = require('mongoose')
const dbConfig = require('./dbs/config')
mongoose.connect(dbConfig.dbs, {
useNewUrlParse: true
})
抽空查看useNuwUrlParse配置什么。后期补上
使用
新建实例+接口
写入数据库
router.post('/addPerson', async function(ctx) {
const person = new Person({
name: ctx.request.body.name,
age: ctx.request.body.age
})
let code
try {
await person.save()
code = 0
} catch {
code = -1
}
ctx.body = {
code
}
})
shell中输入:
curl -d 'name=lhanmeimeiage=28' http://localhot:3000/users/addPerson
读取:
router.post('/getPerson', async function(ctx) {
const result = await Person.findOne({
name: ctx.request.body.name
})
ctx.body = {
code: 0,
result
}
})
shell中输入:
curl -d 'name=lilei' http://localhost:3000/users/getPerson
修改:
router.post('/updatePerson', async function(ctx) {
const result = await Person.where({
name: ctx.request.body.name
}).update({
age: ctx.request.body.age
})
ctx.body = {
code: 0,
result
}
})
删除:
router.post('/removePerson', async function(ctx) {
const result = await Person.where({
name: ctx.request.body.name
}).remove()
ctx.body = {
code: 0,
result
}
})
Redis
问题: 服务端如何识别客户端的登录状态?
答: 服务端把session种植到cookie中, 下次访问客户端会带着cookie去访问服务端。 服务端通过cookie识别该用户是否第一次登录。
redis 是一个存储数据库, 快速读写, 使用简单
安装:
-
官网http://redis.io/ 下载最新的稳定版本
-
sudo mv 到 /usr/local/
-
sudo tar -zxf redis-x.x.x.tar 解压文件
-
进入解压后的目录 cd redis-3.2.0
-
sudo make test 测试编译
-
sudo make install
启动
redis-server
koa如何连接redis?
这里用到两个中间件:
- koa-redis ====> 连接redis
- koa-generic-session ====> 处理session
npm install koa-redis koa-generic-session
如何使用?
app.js中引入:
const session = require('koa-generic-session')
const Redis = require('koa-redis')
加密session
app.keys=['keys', 'keykey']
使用Redis
app.use(session({
store: new Redis()
}))
在pv中间件中,设置访问了多少次
function pv(ctx) {
ctx.session.count++
global.console.log('pv' + ctx.path);
}
module.exports = function() {
return async function(ctx, next) {
pv(ctx); //执行操作
await next(); // 这一步很重要, 等待执行完毕, 交给下一个中间件
}
}
前面说了,redis是用来存储高速的变化的数据的,那么现在我想用redis存储一些诗句怎么办?
第一步: 在路由中引入redis
const Redis = require('koa-redis')
第二步: 新建客户端
const Store = new Redis().client
第三步: 创建路由, 并存储数据
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的客户端访问
keys *
得到结果
1) "koa:sess:VkHvftBqDXyPJR5M6wDOptNchjbRGRg3"
2) "koa:sess:L1MPm7ZUNe9knRwtTpo1bx2umRs1u1Du"
127.0.0.1:6379> keys *
1) "koa:sess:VkHvftBqDXyPJR5M6wDOptNchjbRGRg3"
2) "koa:sess:L1MPm7ZUNe9knRwtTpo1bx2umRs1u1Du"
3) "koa:sess:OKKOo1qW2SWD3GhDlPOpx5CgImtKdwBl"
4) "fix"
5) "koa:sess:nGE1ulNRltuF_jvAgAl9pYnaJmZVulep"
6) "koa:sess:QMvts_30V7zlrkHe-0gQtLlEdekpMcc3"
7) "koa:sess:Uab2dEaAJvP1leJXgJ4nKKsl9_CmI_PB"