刚学到的一个知识点
设计思路
- 前端请求的路由不同,所有将最后的路由作为动态参数进行处理(中间件处理)
- 根据动态参数判断是要对哪个类进行crud,从而引用哪个类
- 将引入的类挂载到req中,继续处理
- 根据特殊情况设定参数集,其他具体的类.crud操作统一使用刚刚挂载到req的参数调用
具体的代码实现
module.exports = app =>{
const express = require("express")
const router = express.Router()
// 创建分类
router.post('/',async(req,res)=>{
const model = await req.Model.create(req.body);
res.send(model)
});
// 修改分类
router.put('/:id',async(req,res)=>{
const model = await req.Model.findByIdAndUpdate(req.params.id,req.body);
res.send(model);
})
// 获取分类
router.get('/',async(req,res)=>{
// 特定参数处理
const queryOptions = {};
// console.log(req.Model);//Model { Category }
// console.log(req.Model.modelName);//Category
if(req.Model.modelName ==='Category'){
queryOptions.populate = 'parent'
}
const items = await req.Model.find().setOptions(queryOptions).limit(10);
res.send(items)
});
// 根据id获取分类
router.get('/:id',async(req,res)=>{
const model = await req.Model.findById(req.params.id);
res.send(model)
});
// 删除
router.delete('/:id',async(req,res)=>{
await req.Model.findByIdAndDelete(req.params.id);
res.send({
success: true
})
});
// 将最后的路由设为动态参数
// 中间件处理这个参数
app.use('/admin/api/rest/:resource',async(req,res,next)=>{
// 用inflection插件 处理参数,将小写改为大写,复数改单数,就是类的名称
const Model = require('inflection').classify(req.params.resource);
//根据处理后的参数对应引用文件 挂载到reqa的Model参数中
req.Model = require(`../../models/${Model}`);
// 放行
next();
},router)
}