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