基于node, koa自动化生成Restful风格的curd

583 阅读2分钟

加载模块文件

// util/loaderModel.js
const {Sequelize} = require('sequelize')
const path = require('path')
const fs = require('fs')
const config = require('../config.js')
//根据文件夹名进行加载对应文件夹下的模块
function loader(dir,cb){
   const url = path.resolve(__dirname,dir)
   const files = fs.readdirSync(url)
   //循环该文件夹下的文件,
   files.forEach(item => {
     const fileName = item.replace('.js','')  //获取文件名后续用来当作属性名
     const file = require(`${url}/${fileName}`) //获取表对象
     cb(fileName,file)
   })
}
function loaderModel(config){
  return function(app){
    const sequelize = new Sequelize(config.database,config.username,config.password,config.options)
    app.$model = {}
    loader('../model', async (fileName,file) => {
        app.$model[fileName] = sequelize.define(fileName,file,{
            timestamps: false
    })//将实例挂载在app.$model下
    await app.$model[fileName].sync()
    })
  }
}
module.exports = loaderModel

数据库配置文件

// config.js
// 数据库的配置(本文基于sequlize框架)
module.exports = {
    database:'kkk',//库名
    username:'root',//用户名
    password:'12345678',//密码
    options:{ //配置
        host:'localhost',
        dialect:'mysql'
    }
}

model下的文件(定义每个表的属性)

// model/human.js
const { Sequelize } = require("sequelize");
module.exports = {
  name: Sequelize.TEXT,
  favoriteColor: {
    type: Sequelize.TEXT,
    defaultValue: 'green'
  },
  age: Sequelize.INTEGER,
  cash: Sequelize.INTEGER,
  id:{type:Sequelize.INTEGER, primaryKey: true, autoIncrement: true}
}
// model/user.js
const { Sequelize } = require("sequelize");
module.exports = {
  name: Sequelize.TEXT,
  favoriteColor: {
    type: Sequelize.TEXT,
    defaultValue: 'green'
  },
  age: Sequelize.INTEGER,
  cash: Sequelize.INTEGER,
  id:{type:Sequelize.INTEGER, primaryKey: true, autoIncrement: true}
}

Restful接口的路由风格

// routes.js
const Router = require('koa-router')
const router = new Router()
const {init,get,list,create,update,delte} = require('./api')
router.get('/:list/:id',init,get)
router.get('/:list',init,list)
router.post('/:list/:id',init,create)
router.delete('/:list/:id',init,delte)
router.put('/:list/:id',init,update)
module.exports = router.routes()

路由中间件(初始化路由,已经生成对应的curd)

// api.js
//初始化将对应的接口挂载在ctx._model下
async function init (ctx,next){
   const model = ctx.app.$model[ctx.params.list]
   if(model){
       ctx._model =  model
   }else{
       console.error('无该表')
   }
   await next()
}
//根据id查找
async function get(ctx,next){
   const item =  await ctx._model.findOne({
        where:{
           id:ctx.params.id
        }
    })
    ctx.body= item
}
//查找整个列表
async function list(ctx){
    const item = await ctx._model.findAll()
    ctx.body = item
}
//创建一个
async function create(ctx){
    const item = await ctx._model.create(ctx.request.body)
    ctx.body = item
}
//根据id修改一个
async function update(ctx){
    const item = await ctx._model.update(ctx.request.body,{
        where:{
           id:ctx.params.id
        }
    })
    ctx.body = item
}
//根据id删除对应
async function delte(ctx){
      await ctx._model.destroy({
         where:{
            id:ctx.params.id
         }
     })
     ctx.body = '删除成功'
}
module.exports = {init, get, list, create, update, delte}

index文件

//  index.js
const Koa = require('koa')
const routers = require('./routes.js')
const loaderModel = require('./util/loaderModel.js')
const config = require('./config')
const bodyPaser = require('koa-bodyparser')
const app = new Koa()
app.use(bodyPaser())
loaderModel(config)(app)
app.use(routers)
app.listen('3001',() => console.log('成功链接'))

测试接口

先运行index.js

创建一个

截屏2021-11-08 上午10.50.27.png

根据id查询

截屏2021-11-08 上午10.52.12.png

查询整个表

截屏2021-11-08 上午10.59.25.png

根据id修改

截屏2021-11-08 上午11.06.00.png

根据id删除

截屏2021-11-08 上午11.09.19.png

截屏2021-11-08 上午11.10.15.png