mongodb安装
- “install mongoDB compass” 不勾选
安装 Robo 3T
启动
- 安装了 mongodb,现在让我们创建一个 data 的目录然后在 data 目录里创建 db 目录。
c:\>cd c:\
c:\>mkdir data
c:\>cd data
c:\data>mkdir db
c:\data>cd db
c:\data\db>
- 启动
C:\mongodb\bin\mongod --dbpath c:\data\db
使用mongoose
koa项目中
npm i mongoose
- 创建配置
mkdir dbs
mkdir dbs/models
touch dbs/config.js
touch dbs/models/user.js // eg: 例子
- config.js
module.exports = {
// 数据库
dbs: 'mongodb://127.0.0.1:27017/dbs'
}
- user.js
// 建表
const mongoose = require('mongoose')
// 声明
const userSchema = new mongoose.Schema({
name: String,
age: Number,
address: String
})
// 跟数据关联. '桥梁' 具体操作 => 实例
module.exports = mongoose.model('User', userSchema)
- 构造UserModel的类 在UserModel中封装了对MongoDB的查询(findOne)、插入(save)、更新(findOneAndUpdate)操作 引用
import mongoose from 'mongoose'
const userSchema = new mongoose.Schema({
username: {
type: String,
unique: true,
require: true
},
password: {
type: String,
require: true
},
email: {
type: String,
require: true
}
})
class UserModel {
constructor(connection, schema) {
this.name = 'user'
this.schema = schema
this.model = connection.model('userModel', this.schema, this.name)
}
// 查询
findOne(username) {
return new Promise((resolve, reject) => {
this.model.findOne({
username
}, (err, record) => {
if (err) {
reject(false)
} else {
resolve(record)
}
})
})
}
// 插入或更新
insertOrUpdate(data) {
return new Promise((resolve, reject) => {
this.model.findOne({
username: data.username
}, (err, record) => {
if (err) {
reject(false)
} else {
// 不存在
if (record) {
// 创建
let user = new this.model(data)
user.save((err) => {
if (err) {
reject(false)
} else {
resolve(data)
}
})
} else {
// 更新
this.model.findOneAndUpdate({
username: data.username
}, data, {
new: true,
upsert: true
}, (err, res) => {
if (err) {
reject(false)
} else {
resolve(res)
}
})
}
}
})
})
}
// 创建
create(data) {
return new Promise((resolve, reject) => {
let user = new this.model(data)
user.save((err) => {
if (err) {
reject(false)
} else {
resolve(data)
}
})
})
}
}
const user = new UserModel(mongoose, userSchema)
export default user
- 数据库连接 (app.js)
...
// 数据库
const mongoose = require('mongoose')
// 配置
const dbConfig = require('./dbs/config')
// 连接
mongoose.connect(dbConfig.dbs, {
useNewUrlParser: true
})
...
- 接口 (routes)
const router = require('koa-router')()
const User = require('../dbs/models/user')
// 补充前缀
router.prefix('/users')
// 接口
router.post('/addUser',async function (ctx) {
// 创建一条数据
const user = new User({
// post传参
name: ctx.request.body.name,
age: ctx.request.body.age,
address: ''
})
let code
try {
// 保存到数据库
await user.save()
code = 0
} catch (e) {
code = -1
}
ctx.body = {
code
}
})
- 模拟请求(git bash)
<!-- git bash 使用, 贴贴快捷键 shift + insert-->
<!-- -d: post请求 -->
<!--'name=xiaoer&age=18&address=""' request.body 传参-->
curl -d 'name=xiaoer&age=18&address=""' 请求路径
增删改查
- 增: 实例.save()
- 改: model.where({…}).update({…})
- 删: model.where({…}).remove()
- 查: model.find({…}) findOne({…})
const router = require('koa-router')()
const UserModel = require('../dbs/models/user')
// 补充前缀
router.prefix('/users')
router.get('/', function (ctx, next) {
global.console.log(ctx)
ctx.body = 'this is a users response!'
})
router.get('/bar', function (ctx, next) {
ctx.body = 'this is a users/bar response'
})
// 接口 增
router.post('/addUser',async function (ctx) {
// 创建一条数据
const user = new UserModel({
// post传参
name: ctx.request.body.name,
age: ctx.request.body.age,
address: ''
})
let code
try {
// 保存到数据库 实例方法
await user.save()
code = 0
} catch (e) {
code = -1
}
ctx.body = {
code
}
})
// remove
router.post('/removeUser',async function (ctx) {
const user = await UserModel.where({
name: ctx.request.body.name
}).remove()
let code
try {
code = 0
} catch (e) {
code = -1
}
ctx.body = {
code
}
})
// update 更新一个文档数据库,并将结果返回给你的应用程序,使用findOneAndUpdate代替。
router.post('/updateUser/:param',async function (ctx) {
let param = ctx.params.param
const user = await UserModel.where({
_id: ctx.request.body.id
}).update({
[param]: ctx.request.body[param]
})
let code
try {
code = 0
} catch (e) {
code = -1
}
ctx.body = {
code
}
})
// find 查询
router.post('/find/:param',async function (ctx) {
let param = ctx.params.param
const res = await UserModel.find({
[param]: ctx.request.body[param]
})
const resOne = await UserModel.findOne({
[param]: ctx.request.body[param]
})
let code
try {
code = 0
} catch (e) {
code = -1
}
ctx.body = {
code,
res,
resOne
}
})
module.exports = router
Redis
项目中通过两个中间件连接 koa-generic-session kod-redis
开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
关于redis的启动问题
C:\Users\hylexus> redis-server --service-start
[13032] 04 Apr 17:58:42.168 # HandleServiceCommands: system error caught. error code=1056, message = StartService failed: unknown error#
先停止,再试试启动会不会正常
C:\Users\hylexus> redis-server --service-stop
[5308] 04 Apr 17:58:47.284 # Redis service successfully stopped.#
再次尝试启动[成功]
C:\Users\hylexus> redis-server --service-start
[15200] 04 Apr 17:58:52.940 # Redis service successfully started.#
连接客户端测试
C:\Program Files\Redis>redis-cli -p 6379127.0.0.1:6379> ping
PONG127.0.0.1:6379> ping haha"haha"127.0.0.1:6379> exit#
停止服务
C:\Program Files\Redis>redis-server --service-stop
==========> redis-server