手把手教你基於koa2,mongoose實現增刪改查

  • 初始化項目
npm init -y
  • 先安裝一波亂七八糟的依賴插件(須要具有必定的koa2知識,至於mongoDB自行百度安裝教程),模板引擎我使用的是art-template(聽說是性能最好的,並且是由於JQ時代的產物,念舊)
npm i koa koa-router koa-bodyparser koa-static koa-views art-template koa-art-template mongoose  -S
  • 安裝nodemon實時監聽修改
npm i nodemon -D
  • 新建app.js入口文件,擼一把基礎代碼
const Koa = require('koa')
const app = new Koa()
const views = require('koa-views')

const bodyParser = require('koa-bodyparser')
// const Router = require('koa-router')
const path = require('path')
// const router = new Router()

const {connect} = require('./dbs/init.js')  //導入mongodb數據庫
const {createUser} = require('./controller/users.js')

// 模板引擎
const render = require('koa-art-template');
render(app, {
  root: path.join(__dirname, 'views'),
  extname: '.html',
  debug: process.env.NODE_ENV !== 'production'
});

//自執行函數,連接數據庫
;(async ()=>{
  await connect()
})()

const userRouter = require('./controller/users.js')
app.use(userRouter.routes(),userRouter.allowedMethods())
// app.use(router.routes(),router.allowedMethods())

app
  .use(bodyParser({enableTypes:['json', 'form', 'text']}))
  .use(require('koa-static')(__dirname + '/public'))
  .use(views(__dirname + '/views', {
    extension: 'html'
  }))

app.listen(4000,()=>{
  console.log('listen at port localhost:4000 ');
})
  • 新建dbs文件夾,在下面統一管理數據庫相關,新建init.js數據庫初始化
const mongoose = require('mongoose')
const db = 'mongodb://localhost/mongo_test'; //link
// const glob = require('glob')
// const {resolve} = require('path')

// exports.initSchemas = ()=>{
//   // glob.sync(resolve(__dirname,'./schema','**/*.js')).forEach(require)
// }


// 鏈接數據庫,URL以mongodb:// + [用戶名:密碼@] +數據庫地址[:端口] + 數據庫名。(默認端口27017)
// 鏈接mongodb數據庫的連接解析器會在將來移除,要使用新的解析器,經過配置{ useNewUrlParser:true }來鏈接 ;其餘警告參考:https://mongoosejs.com/docs/deprecations.html

/**
 * 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 dbc = mongoose.connection
exports.connect = ()=> {
  // 連接數據庫
  mongoose.connect(db)
  let  maxConnectTimes = 0
  
  return new Promise((resolve,reject)=>{

    // 增長數據庫監聽事件:斷開連接
    dbc.on('disconnected',()=>{
      console.log('***********數據庫斷開***********')
      if(maxConnectTimes<=3){
        maxConnectTimes++
        mongoose.connect(db)
      }
      else {
        reject()
        throw new Error('數據庫出現問題,請人爲修理.....')
      }
    })
  
    dbc.on('error',err=>{
      console.log('***********數據庫出錯***********')
      if(maxConnectTimes<=3){
        maxConnectTimes++
        mongoose.connect(db)
      }
      else {
        reject()
        throw new Error('數據庫出現問題,請人爲修理.....')
      }
      
    })
  
    dbc.once('open',()=>{
      console.log('MongoDB Connected successfully!')
      resolve()
    })
  })
  
}
  • 在dbs文件夾下新建schema文件夾用於建立各類schema表,新建Users.js
const mongoose = require('mongoose');

const Schema = mongoose.Schema;

let ObjectId = Schema.Types.ObjectId;

const userSchema = new Schema({
  UserId : {type:ObjectId},
  userName:{unique:true,type:String},//unique表示索引惟一
  password:String,
  gender:Number,
  userStatus:Number,
  createAt:{type:Date,default:Date.now()},
  lastLoginAt:{type:Date,default:Date.now()}
},{collection:'users'})

const model = {
  Users:mongoose.model('Users',userSchema)
}

// 發佈模型
module.exports = model
  • 新建controller文件夾,主要是用來處理一些業務邏輯,新建users.js文件
let {
  addUser,
  updateUser,
  delUser,
  findAllUsers,
  findOne
} = require('./tools.js');

const common = require("../libs/common");
const Users = require('../dbs/schema/Users.js').Users
const Router = require('koa-router') ;

let router = new Router()
router.prefix('/user')
// 查找列表
router.get('/list',async (ctx)=>{
  let code = 0 // 狀態碼
  let msg = '' // 返回內容
  let {keyword} = ctx.query ;
  let params = {
    keyword
  }
  let ret = await findAllUsers(params)
  ctx.body = {
    code,
    list:ret,
    msg:'操做成功'
  }
})
// 查找信息
router.get('/detail',async (ctx)=>{
  let code = 0 // 狀態碼
  let msg = '' // 返回內容
  let {id} = ctx.query ;
  let params = {
    id
  }
  let ret = await findOne(params)
  ctx.body = {
    code,
    list:ret,
    msg:'操做成功'
  }
})
router.post('/addUser',async (ctx)=>{
  let code = 0 // 狀態碼
  let msg = '' // 返回內容

  let {userName,password,gender,type,id} = ctx.request.body ;
  
  if(type=='edit'){
    if(id){
      let ret = await updateUser(ctx.request.body)
      if(ret.ok==1){
        code = 0
        msg = '修改爲功' 
      }
      else {
        code = -1
        msg = '修改失敗,' 
      }
    }
    else{
      code = -1
      msg = '參數錯誤,' 
    }
  }
  // 刪除
  else {
    // let id = common.uuid();
    let user = new Users({
      userName,
      password,
      gender,
      userStatus:1
    })
    try {
      let ret = await addUser(user)
      console.log(ret);
      
      code = 0
      msg = '添加成功' 
    } catch (error) {
      code = -1
      msg = '新建失敗' 
    }
  }
  ctx.body = {
    code,
    msg
  }
})

router.post('/del',async (ctx)=>{
  let code = 0 // 狀態碼
  let msg = '' // 返回內容
  let ret = await delUser(ctx.request.body)
  console.log(ret);
  
  if(ret){
    ctx.body = {
      code,
      msg:'刪除成功'
    }
  }
  else {
    ctx.body = {
      code:-1,
      msg:'參數錯誤'
    }
  }
})
module.exports = router
  • 在當前controller目錄下新建增刪改查工具方法,tools.js
// 導入schama
const Users = require('../dbs/schema/Users.js').Users
/* 查全部用戶 */
exports.findAllUsers = async (params) => {
  let keyword = params.keyword ||'' ;
  const reg = new RegExp(keyword, 'i') //不區分大小寫
  // 模糊查詢
  let _filter = {
    userStatus:1,
    $or:[
      {
        userName:{$regex :reg}
      }
    ]
  }
  let count = 0
  count = await Users.countDocuments(_filter)

  let ret = await Users.find(_filter).limit(20)
  let _list = ret.map(v=>{
    return {
      username:v.userName,
      gender:v.gender,
      createAt:v.createAt,
      lastLoginAt:v.lastLoginAt,
    }
  })
  return {
    count,
    list:_list
  }

};
/* 查單個用戶 */
exports.findOne = async (params) => {
  let ret = await Users.findOne({_id:params.id})
  let info = {
    id:ret._id,
    userName:ret.userName,
    createAt:ret.createAt,
    lastLoginAt:ret.lastLoginAt,
    gender:ret.gender
  }
  return {
    info
  }
};
/* 新增用戶 */
exports.addUser = async (userParams) => {
  console.log('add=');
  console.log(userParams);
  return await userParams.save();
};

/**
 * 編輯
 */
exports.updateUser = async (userParams)=>{
  console.log('edit=');
  console.log(userParams);
  
  return await Users.updateOne({_id:userParams.id},{
    $set:{
      userName:userParams.userName,
      password:userParams.password,
      gender:userParams.gender
    }
  })
}


/**
 * 硬刪除
 */
exports.removeUser = async (userParams)=>{
  return await Users.findOneAndRemove({_id:userParams.id})
}
/**
 * 軟刪除
 */
exports.delUser = async (userParams)=>{
  return await Users.findOneAndUpdate({_id:userParams.id},{userStatus:0})
}
  • 運行代碼:配置package.json,scripts新增"dev": "nodemon node ./app.js"

  • 運行:npm run devjavascript

  • loacahost:4000/user/list獲取列表
  • loacahost:4000/user/detail獲取用戶詳情
  • loacahost:4000/user/addUser新增用戶
  • loacahost:4000/user/del刪除用戶html

相關文章
相關標籤/搜索