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
具体验证
在Node.js项目中同时集成RedisMongoose,通常情况下我们会将Redis作为缓存层,用于存储一些热点数据或频繁查询的数据,而将Mongoose用于处理与数据库(例如MongoDB)的持久化操作。下面是一个简单的例子,展示如何在Node.js中分别使用这两个工具: 首先,安装依赖: ```bash npm install redis mongoose ``` 然后,在`app.js`或其他入口文件中: **引入并初始化RedisMongoose** ```javascript const redis = require('redis'); const client = redis.createClient(); client.on('error', (err) => console.error(`Redis error: ${err}`)); const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/mydatabase', { useNewUrlParser: true }); mongoose.connection.once('open', () => { console.log("Connected to MongoDB"); }); ``` **定义Mongoose模型(假设有一个User模型)** ```javascript const userSchema = new mongoose.Schema({ name: String, email: String }); const User = mongoose.model('User', userSchema); ``` **使用Mongoose进行CRUD操作** ```javascript // 创建新用户 async function createUser(user) { try { const newUser = new User(user); await newUser.save(); console.log('User created:', newUser); } catch (error) { console.error('Error creating user:', error); } } // 查询用户 async function getUser(id) { try { return await User.findById(id); } catch (error) { console.error('Error fetching user:', error); } } // 更新用户 async function updateUser(id, updatedData) { try { const updatedUser = await User.findByIdAndUpdate(id, updatedData); console.log('User updated:', updatedUser); } catch (error) { console.error('Error updating user:', error); } } // 删除用户 async function deleteUser(id) { try { await User.findByIdAndDelete(id); console.log('User deleted'); } catch (error) { console.error('Error deleting user:', error); } } ``` **使用Redis作为缓存(这里仅示例查询缓存)** ```javascript function getFromCache(key) { return new Promise((resolve) => { client.get(key, (err, result) => { if (err) { resolve(null); } else { resolve(result ? JSON.parse(result) : null); } }); }); } // 缓存查询结果 getUser('1').then((user) => { // 如果存在,则直接返回 getFromCache(`user_${user._id}`).then((cachedUser) => { if (cachedUser) { console.log('Found in cache:', cachedUser); } else { // 如果不存在于缓存,则保存到缓存并返回用户 client.setex(`user_${user._id}`, 60, JSON.stringify(user)); // 设置过期时间为60秒 console.log('Not found in cache, saving to cache:', user); } }); }); ``` 这个例子展示了基本的RedisMongoose集成,实际项目中可能会根据需求进行更复杂的设计,比如错误处理、事务控制等。记得关闭连接时释放资源哦: ```javascript process.on('SIGINT', async () => { client.quit(); mongoose.disconnect(); process.exit(0); }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值