zoukankan      html  css  js  c++  java
  • koa2入门(3)mongoose 增删改查

    项目地址:https://github.com/caochangkui/demo/tree/koa-mongoose

    连接数据库

    数据库名字为:koa-mongoose

    const mongoose = require('mongoose')
    
    // 连接数据库,URL以mongodb:// + [用户名:密码@] +数据库地址[:端口] + 数据库名。(默认端口27017)
    // 连接mongodb数据库的链接解析器会在未来移除,要使用新的解析器,通过配置{ useNewUrlParser:true }来连接 ;其他警告参考:https://mongoosejs.com/docs/deprecations.html
    mongoose.connect('mongodb://127.0.0.1:27017/koa-mongoose', {useNewUrlParser:true,useCreateIndex: true})
    
    /**
     * mongoose从@5.2.8后会弃用一些指令,为防止程序如下警告:
     * (node:24864) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.
     * (node:24841) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.
     * 可以如下设置
     */
    mongoose.set('useNewUrlParser', true)
    mongoose.set('useFindAndModify', false)
    mongoose.set('useCreateIndex', true)
    
    let db = mongoose.connection
    mongoose.Promise = global.Promise // 防止Mongoose: mpromise 错误
    
    db.on('error', function (err) {
      console.log('数据库连接出错', err)
    })
    
    db.on('open', function () {
      console.log('数据库连接成功')
    })
    
    db.on('disconnected', function () {
      console.log('数据库连接断开')
    })
    

    创建数据表

    /* 
    声明 Schema
    创建数据表模型,即 User,就是数据表的名字
    下面给 User 表声明三个字段 username password age
    */
    const userSchema = mongoose.Schema({
      username: {
        type: String,
        required: true
      },
      password: {
        type: String,
        require: true
      },
      age: {
        type: Number,
        require: true
      }
    })
    
    // 根据 schema 生成 model
    const model = {
      User: mongoose.model('User', userSchema)
    }
    
    module.exports = model
    

    定义 mongoose 数据库操作方法

    const User = require('../dbs.js').User // 从dbs.js引入数据表
    
    /**
     * 数据库操作
     */
    
    // 增加用户,方法一:save()
    const saveUser = async (ctx) => {
      // 通过实例化一个 User 对象在添加用户
      const newUser = new User({
        username: 'cedric',
        password: '123',
        age: 27
      })
    
      let code = 0 // 状态码
      let result = '' // 返回内容
    
      try {
        let doc = await newUser.save()
        code = 0
        result = '保存成功, ' + doc
      } catch (err) {
        code = -1
        result = '保存失败, ' + err
      }
    
      ctx.response.body = {
        code,
        result
      }
      return result
    }
    
    // 增加用户,方法二:create(), 推荐此方法
    // 使用save()方法,需要先实例化为文档,再使用save()方法保存文档。而create()方法,则直接在模型Model上操作,并且可以同时新增多个文档
    const createUser = async (ctx) => {
      let code = 0 // 状态码
      let result = '' // 返回内容
    
      try {
        let doc = await User.create({
          username: 'cedric222',
          password: '123',
          age: 27
        }, {
          username: 'cedric333',
          password: '123',
          age: 27
        })
        code = 0
        result = '保存成功, ' + doc
      } catch (err) {
        code = -1
        result = '保存失败, ' + err
        console.log(err)
      }
    
      ctx.response.body = {
        code,
        result
      }
      return result
    }
    
    // 根据用户名查找用户
    const findUser = async (ctx) => {
      let code = 0 // 状态码
      let result = '' // 返回内容
    
      try {
        let doc = await User.findOne({
          username: 'cedric222'
        })
        code = 0
        result = '查找结果: ' + doc
      } catch (err) {
        code = -1
        result = '查找失败: ' + err
      }
    
      ctx.response.body = {
        code,
        result
      }
      return result
    }
    
    // 根据指定条件查找所有用户
    // find指的是查找指定表的所有数据,返回的是数组
    // findOne指的是查找指定表的单条数据,返回一个对象
    const findAllUser = async (ctx) => {
      let code = 0 // 状态码
      let result = '' // 返回内容
    
      try {
        let doc = await User.find({})
        code = 0
        result = '查找结果: ' + doc
      } catch (err) {
        code = -1
        result = '查找失败: ' + err
      }
    
      ctx.response.body = {
        code,
        result
      }
      return result
    }
    
    // 修改用户数据
    // conditions: 查询条件;updateDoc:需要修改的数据, 都是一个对象
    // multi (boolean): 默认为false。是否更新多个查询记录。
    // https://segmentfault.com/a/1190000012095054#articleHeader16
    // https://mongoosejs.com/docs/api.html#model_Model.update
    const updateUser = async (ctx) => {
      let code = 0 // 状态码
      let result = '' // 返回内容
    
      try {
        let doc = await User.update({age: 27}, {age: 28}, {multi: true})
        code = 0
        result = '修改结果: ' + doc
        console.log(doc)
      } catch (err) {
        code = -1
        result = '修改失败: ' + err
      }
    
      ctx.response.body = {
        code,
        result
      }
      return result
    }
    
    // 删除用户数据
    const removeUser = async (ctx) => {
      let code = 0 // 状态码
      let result = '' // 返回内容
    
      try {
        let doc = await User.remove({username: 'cedric444'})
        code = 0
        result = '删除成功: ' + doc
        console.log(doc)
      } catch (err) {
        code = -1
        result = '删除失败: ' + err
      }
    
      ctx.response.body = {
        code,
        result
      }
      return result
    }
    
    module.exports = {
      saveUser,
      createUser,
      findUser,
      findAllUser,
      updateUser,
      removeUser
    }
    
    

    入口文件app.js

    const Koa = require('koa')
    const app =  new Koa();
    
    const Router = require('koa-router') // koa路由中间件
    
    const router = new Router({
      prefix: '/api'
    }) // 父路由, 给路由统一加个前缀 /api
    
    const bodyParser = require('koa-bodyparser') // 处理post请求,把 koa2 上下文的表单数据解析到 ctx.request.body 中
    app.use(bodyParser())
    
    // 引入数据库操作方法
    const UserController = require('./server/controller/users.js')
    
    // 路由,访问:http://localhost:3333/api/save
    router.get('/save', UserController.saveUser)
    router.get('/create', UserController.createUser)
    router.get('/find', UserController.findUser)
    router.get('/findall', UserController.findAllUser)
    router.get('/update', UserController.updateUser)
    router.get('/remove', UserController.removeUser)
    
    
    // 加载路由中间件
    app.use(router.routes())
    // allowedMethods 处理的业务是当所有路由中间件执行完成之后,若ctx.status为空或者404的时候,丰富response对象的header头
    app.use(router.allowedMethods())
    
    app.listen(3333, () => {
      console.log('This server is running at http://localhost:' + 3333)
    })
    
  • 相关阅读:
    4、idea使用git
    ♫【MongoDB】
    -_-#【网站优化】预加载(Pre-loader) / 预读取(Pre-fetching)
    【Node】package.json
    ☀【移动】Google Maps JavaScript API v3
    -_-#【移动】视频分段
    ☀【Grunt】package.json, Gruntfile.js, npm install, grunt
    【three.js】
    【单元测试】
    洛谷——P1125 笨小猴
  • 原文地址:https://www.cnblogs.com/cckui/p/10429064.html
Copyright © 2011-2022 走看看