mongoose+redis

mongodb安裝

教程

  • “install mongoDB compass” 不勾選

安裝 Robo 3T

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
具體驗證
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章