目录
引言
在前一篇教程中,我们学会了如何搭建基于Express框架的Web平台,为初学者打下了坚实的基础。随着技术的发展和项目需求的日益复杂,我们迫切需要一种更加高效、模块化的解决方案来优化开发流程。本篇教程旨在进一步引导初学者,通过借鉴SpringBoot框架的设计理念,实现一个轻量级的Express应用结构。我们将重点介绍如何进行项目目录文件的功能划分和路由分离,以构建一个逻辑清晰、层次分明的应用程序。通过本教程的学习,你将掌握如何合理组织代码,提高开发效率,同时确保项目的可维护性和可扩展性,为未来可能的功能迭代和团队协作打下坚实的基础。
一、项目划分
- Controller层:负责路由接收
- Service层:负责业务逻辑
- Dao层:负责数据库的操作等
- Common目录:负责管理工具、配置文件信息等
创建文件夹以及文件如图所示
二、分离文件需求分析
- 模块化:按功能划分模块,如路由、数据库等。
- 文档化:确保有清晰的文档说明目录结构。
- 服务化:对于复杂的业务逻辑,可以将其设计为独立的服务,与其他部分解耦。
- 复用率:提高代码可复用率,减少代码冗余
三、实现
1. app.js文件分离
1.1 启动文件分离
// app.js
// 以下两行注释仅用于记录系统启动速度,读者可自行斟酌。
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操作分离
//src/index.js
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 封装返回信息类
// common/models/Result.js
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 三层架构
// UserController.js
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;
// UserService.js
const UserDao = require("../dao/UserDao");
class UserService {
async getUserList(){
return await UserDao.getUserList();
}
}
module.exports = new UserService();
//UserDao.js
class UserDao {
async getUserList() {
return "Dao UserList";
}
}
module.exports = new UserDao();
结尾
随着本教程的深入,我们已成功搭建了最基础的Express框架,并实现了项目文件的功能划分与文件分离,这不仅让层级关系变得清晰,更为后续开发奠定了坚实的基础。需求背景在于应对日益复杂的Web开发任务,以及提高开发效率和项目的可维护性。我们通过模块化的设计思路,将不同的功能划分到不同的文件中,使得每个部分都简洁且易于管理。接下来,我们将进入Express中间件的学习,这将进一步增强我们的应用功能,为构建更加强大的Web应用打下基础。