網站首頁 編程語言 正文
一、為什么需要邏輯抽離
這是我用express實現的一個縮減版的注冊功能,如下:
- app.js
const express = require("express");
const app = express();
// 連接數據庫
const mongoose = require("mongoose");
// 連接數據庫myTest
mongoose
.connect("mongodb://localhost:27017/myTest", { useNewUrlParser: true, useUnifiedTopology: true })
.then(() => {
console.log("數據庫連接成功");
})
.catch((err) => {
console.log(err, "數據庫連接失敗");
});
// 創建集合規則
const userSchema = new mongoose.Schema({
userName: {
type: String,
required: true,
},
passWord: {
type: String,
required: true,
},
});
// 創建Users集合
const User = mongoose.model("User", userSchema);
const cors = require("cors");
// 解決跨域
app.use(cors());
// 支持json格式的請求體數據
app.use(express.json());
// 支持urlencoded格式的請求體數據
app.use(express.urlencoded({ extended: true }));
// 注冊接口
app.post("/register", async (req, res) => {
const userModel = new User(req.body);
// 將用戶注冊的信息保存到數據庫中
const dbBack = await userModel.save();
user = dbBack.toJSON();
// 以json格式返回給客戶端
res.status(201).json({
code: 201,
msg: "注冊成功",
user,
});
});
// 監聽3000端口
app.listen(3000, () => {
console.log("server is running at http://localhost:3000");
});
目錄結構如下:
可以看到的是所有的邏輯,創建服務器、鏈接數據庫、創建集合、注冊都在app.js文件中,這只是一個簡單的注冊功能,可能看上去還不是很亂,但是當我們后面項目越來越大,所做的功能越來越多,顯然,將所有的邏輯功能都集中在app.js中是不行的,這樣既不利用開發,也不利于后期維護,所以對邏輯的抽離,和整體項目結構的劃分是很有必要的。
二、項目結構的搭建
1. 路由模塊的抽離
這里我們先不考慮注冊功能是否能實現了,只是單純的做個邏輯劃分,看抽離完成之后的路由是否在客戶端可以訪問到就可以了。
新建router
文件夾,在router
文件夾下新建index.js
和user.js
文件,如圖:
- index.js
const express = require('express');
const router = express.Router();
router.use('/user', require('./user'));
module.exports = router;
- user.js
const express = require("express");
const router = express.Router();
router.post("/register", (req, res) => {
console.log(req.body);
res.send("register");
});
module.exports = router;
然后我們去app.js
中引入router/index.js
- app.js
const express = require("express");
const app = express();
app.use(express.json());
const router = require("./router");
app.use('/api/v1', router);
// 監聽3000端口
app.listen(3000, () => {
console.log("server is running at http://localhost:3000");
});
經過這樣的抽離以后我們再訪問user/register
接口,就需要加上/api/v1
前綴,如圖:
到這里,我們看app.js
文件中的代碼邏輯是不是很清晰了,我們只是用express
創建了一個web
服務器,然后引入了一個路由文件,就實現了接口訪問的邏輯。
那么接著看看user.js
文件
這里的注冊邏輯,我沒有具體實現,但是后期我們實現的時候,這里邏輯肯定比這復雜,還有就是,user模塊,肯定也不止這一個注冊功能,比如還有登錄、修改密碼、修改頭像等等,這時如果還是將接口的具體實現都集中在user.js中,最后的這個效果就和我們開始分析的app.js文件一養,邏輯太過復雜,導致user.js
文件太過臃腫,不利于維護,所以,我們將user.js
文件中的接口具體實現也單獨抽離出來
新建一個controller
文件夾,controller
文件夾下新增一個userController.js
文件
- userController.js
// 用戶注冊
exports.register =(req, res) => {
console.log(req.body);
res.send("register");
}
修改user.js
文件
const express = require("express");
const router = express.Router();
const userController = require("../controller/userController");
router.post("/register", userController.register);
module.exports = router;
這樣比如我們要加個登錄的功能,只需要在user中加一行代碼就可以了,例如:
const express = require("express");
const router = express.Router();
const userController = require("../controller/userController");
router.post("/register", userController.register);
router.post("/login", userController.login);
module.exports = router;
而具體的登錄邏輯,我們可以在userController
中實現。
好啦,到這里我們的路由的抽離基本就可以了,接下來我們來具體實現一下開始的在app.js中的那個注冊功能。
2. 數據庫操作部分抽離
基于上面的路由抽離,要實現注冊功能,我們可以在userController
中來加上數據方面的操作,如下:
- userController.js
// 連接數據庫
const mongoose = require("mongoose");
// 連接數據庫myTest
mongoose
.connect("mongodb://localhost:27017/myTest", { useNewUrlParser: true, useUnifiedTopology: true })
.then(() => {
console.log("數據庫連接成功");
})
.catch((err) => {
console.log(err, "數據庫連接失敗");
});
// 創建集合規則
const userSchema = new mongoose.Schema({
userName: {
type: String,
required: true,
},
passWord: {
type: String,
required: true,
},
});
// 創建Users集合
const User = mongoose.model("User", userSchema);
// 用戶注冊
exports.register = async (req, res) => {
const userModel = new User(req.body);
// 將用戶注冊的信息保存到數據庫中
const dbBack = await userModel.save();
user = dbBack.toJSON();
// 以json格式返回給客戶端
res.status(201).json({
code: 201,
msg: "注冊成功",
user,
});
};
此時我們在訪問注冊接口:
可以看到數據庫users
集合中成功添加了一條數據,說明我們的注冊功能是實現了。但是,我們在回頭看看userController.js
,此時的數據庫連接操作,創建集合都集中在了這里,就算我們創建users集合放在userController.js中合理,但是數據庫連接呢?
我們的整個項目肯定不止涉及一個集合,每當新建個controller
時,我們都要連接數據庫,所以這個連接數據庫的操作顯然是一個可復用的功能,所以我們先把這一塊的邏輯抽離出來。
新建一個model/index.js
文件
- model/index.js
const mongoose = require("mongoose");
mongoose
.connect("mongodb://localhost:27017/myTest")
.then((res) => {
console.log("mongo鏈接成功");
})
.catch((err) => {
console.log(err);
console.log("mongo鏈接失敗");
});
module.exports = mongoose;
修改userController.js
const mongoose = require("../model/index");
// 創建集合規則
const userSchema = new mongoose.Schema({
userName: {
type: String,
required: true,
},
passWord: {
type: String,
required: true,
},
});
// 創建Users集合
const User = mongoose.model("User", userSchema);
// 用戶注冊
exports.register = async (req, res) => {
const userModel = new User(req.body);
// 將用戶注冊的信息保存到數據庫中
const dbBack = await userModel.save();
user = dbBack.toJSON();
// 以json格式返回給客戶端
res.status(201).json({
code: 201,
msg: "注冊成功",
user,
});
};
但是我們的userController
中應該只注重接口的的具體實現,集合的規則和創建也應該單獨抽離出來
新建model/userModel.js
- model/userModel.js
const mongoose = require("mongoose");
// 創建集合規則
const userSchema = new mongoose.Schema({
userName: {
type: String,
required: true,
},
passWord: {
type: String,
required: true,
},
});
module.exports = userSchema;
修改model/index
導出
- model/index.js
const mongoose = require("mongoose");
const { mongopath } = require("../config/config.default");
mongoose
.connect(mongopath)
.then((res) => {
console.log("mongo鏈接成功");
})
.catch((err) => {
console.log(err);
console.log("mongo鏈接失敗");
});
module.exports = {
User: mongoose.model("User", require("./userModel")),
};
修改userController.js
- userController.js
const { User } = require("../model/index");
// 用戶注冊
exports.register = async (req, res) => {
const userModel = new User(req.body);
// 將用戶注冊的信息保存到數據庫中
const dbBack = await userModel.save();
user = dbBack.toJSON();
// 以json格式返回給客戶端
res.status(201).json({
code: 201,
msg: "注冊成功",
user,
});
};
至此我們實現了controller功能的單一性,也將數據操作都抽離到了model文件夾下,這時我們在用postman訪問一下register接口,如下:
成功訪問!
至此呢我們項目的基本架構就算完成啦。
整體目錄結構如下:
將路由相關訪問抽離到router文件夾下,接口邏輯的具體實現抽離到controller文件夾下,數據庫集合相關操作抽離到model文件夾下,一些配置文件抽離到config文件夾下,我們的入口文件app.js只是創建一個服務器,具體的功能我們只需要引入對于的模塊就可以了
原文鏈接:https://blog.csdn.net/jieyucx/article/details/131695324
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-11-28 協程作用域概念迭代RxTask?實現自主控制_Android
- 2023-07-29 highcharts中gantt甘特圖的使用
- 2022-12-05 關于adfuller函數返回值的參數說明與記錄_python
- 2023-11-16 RuntimeError: Expected object of device type cuda
- 2022-12-05 Linux系統查看服務器帶寬及網絡使用情況的具體方法_服務器其它
- 2022-04-19 python獲取http請求響應頭headers中的數據的示例_python
- 2022-08-05 Activity supporting ACTION_VIEW is not exported
- 2022-11-29 詳解Go語言設計模式之單例模式_Golang
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支