源码地址
git clone https:
git clone https:
入口文件app.js
- 创建expresss实例并挂载到配置的指定端口
- 配置四大常用中间件:json读取、表单读取、二进制文件读取、静态资源
- 将
/user前缀的请求派发给userRouter,实现登录与注册
- 将
/file前缀的请求派发给fileRouter,实现文件上传
- 为
project.config.json中配置的每个业务模块,生成一个对应的xxRouter,并派发过去
const express = require("express")
const multer = require("multer")
const path = require("path")
const fs = require("fs")
const RouterGenerator = require("./views/RouterGenerator")
const userRouter = require("./views/userRouter")
const fileRouter = require("./views/fileRouter")
const { port,routes } = require("./config")
const app = express()
app.use(express.json())
app.use(express.urlencoded({extended:false}))
app.use(multer({dest:path.resolve("temp")}).array("file"))
app.use(express.static(path.resolve("public")))
app.use("/user",userRouter)
app.use("/file",fileRouter)
routes.forEach(
({name,middlewares})=>{
app.use(`/${name}`,RouterGenerator.from(name,middlewares).generate())
}
)
const server = app.listen(
port,
()=>{
const host = server.address().address
const port = server.address().port
console.log("listening at %s:%s",host,port);
}
)
核心类RouterGenerator(xxRouter生成器)
app.use(`/film`,RouterGenerator.from("film",middlewares).generate())
const loginCheck = require("../middlewares/loginCheck");
const adminCheck = require("../middlewares/adminCheck");
const middlewares = {
loginCheck,
adminCheck,
};
- from方法创建一个RouterGenerator实例,并在上面挂载模块名字+6大接口的中间件列表
- 无非是根据用户配置的【中间件名称列表】映射为【中间件实体列表】
static from(collectionName, middlewares = null) {
return Object.assign(
new RouterGenerator(),
{
collectionName,
middlewares: this.applyMiddlewares(middlewares),
}
);
}
static applyMiddlewares(_middlewares) {
for (let key in _middlewares) {
let names = _middlewares[key];
_middlewares[key] = names.map(
(name) => middlewares[name]
);
}
return _middlewares;
}
- 生成xxRouter:创建router对象 + 配置6大接口(每个接口都自带一个中间件列表)+ 返回该router
- 每个接口的实际处理逻辑:直接调用提前封装好的【数据库引擎层接口】实现数据操作
generate() {
const router = express.Router();
router.post(
"/0",
...this.middlewares?.create,
async (req, resp) => {
const result = await doCreate(this.collectionName, req.body);
resp.json(result);
}
);
router.post("/-1", ...this.middlewares?.createMany, async (req, resp) => {
const result = await doCreateMany(this.collectionName, req.body);
resp.json(result);
});
router.delete("/:id", ...this.middlewares?.delete, async (req, resp) => {
const result = await doDelete(req.params.id, this.collectionName);
resp.json(result);
});
router.put("/:id", ...this.middlewares?.update, async (req, resp) => {
const result = await doUpdate(
req.params.id,
req.body,
this.collectionName
);
resp.json(result);
});
router.get("/0", ...this.middlewares?.retrieveMany, async (req, resp) => {
const result = await doRetrieve(this.collectionName, {});
resp.json(result);
});
router.get("/:id", ...this.middlewares?.retrieve, async (req, resp) => {
const result = await doRetrieve(this.collectionName, {
_id: new ObjectId(req.params.id),
});
resp.json(result);
});
return router;
}