加载模块文件
// 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