目录
引言
在上篇的基础上,我们学会了怎么搭建 Express 框架的平台,本篇目的在于教会初学者,怎么一步步实现类似于SpringBoot框架的轻量级结构,以及实现项目目录文件等的功能划分,路由分离等
一、项目划分
- Controller层:负责路由接收
- Service层:负责业务逻辑
- Dao层:负责数据库的操作等
- Common目录:负责管理工具、配置文件信息等
创建文件夹以及文件如图所示
二、分离文件需求分析
- 模块化:按功能划分模块,如路由、数据库等。
- 文档化:确保有清晰的文档说明目录结构。
- 服务化:对于复杂的业务逻辑,可以将其设计为独立的服务,与其他部分解耦。
- 复用率:提高代码可复用率,减少代码冗余
三、实现
1. app.js文件分离
1.1 启动文件分离
// 以下两行注释仅用于记录系统启动速度,读者可自行斟酌。
const port = 3000;
// console.time(`Service http://localhost:${port} Start Time`);
const app = require("./src");
app.listen(port, () => {
// console.timeEnd(`Service http://localhost:${port} Start Time`);
console.log(`Service http://localhost:${port}`);
});
1.2 app操作分离
const app = require("express")();
app.use("/", require("./controller"));
module.exports = app;
2. 路由分离、三层架构各司其职
2.1 路由汇总
// 负责所有路由的导入
const router = require("express").Router();
router.use("/user", require("./UserController"));
module.exports = router;
2.2 封装返回信息类
class Result {
// 定义一个构造函数
constructor(code, message, data) {
this.code = code;
this.message = message;
this.data = data;
}
// 成功
static success(data) {
return new Result(200, "success", data);
}
// 异常
static error(message) {
return new Result(500, message, null);
}
// 相关服务
static Redis(){
return new Result(500, "Redis错误", null);
}
static Db(){
return new Result(500, "数据库错误", null);
}
}
module.exports = Result;
2.3 三层架构
const UserControler = require("express").Router();
const UserService = require("../service/UserService");
const Result = require("../common/models/Result");
UserControler.get("/", async (req, res) => {
res.send(Result.success(await UserService.getUserList()));
});
module.exports = UserControler;
const UserDao = require("../dao/UserDao");
class UserService {
async getUserList(){
return await UserDao.getUserList();
}
}
module.exports = new UserService();
class UserDao {
async getUserList() {
return "Dao UserList";
}
}
module.exports = new UserDao();
结尾
至此最简的Express搭建出来了,而接下来就是Express中间件的学习了。