摘要:前言上次我們搭建了一個基本的后臺,但是這樣的項目結構的可擴展性,維護性和代碼復用性都不是很好,參照之前學習時候的四層架構設計,用分層的思想來對進行一點小優化,進一步提高代碼的可拓展性。實體層針對來說,一個集合對應一個,然后都是這樣的形式啦。
前言 上次我們搭建了一個基本的 express 后臺,但是這樣的項目結構的可擴展性,維護性和代碼復用性都不是很好,參照之前學習 JavaWeb 時候的四層架構設計,用分層的思想來對 express 進行一點小優化,進一步提高代碼的可拓展性。本文的源代碼在 Github 上,建議看著代碼來看這篇文章。
1 四(五)層結構概念這個就簡單說一下,所謂四層架構就是 Model實體層,Dao層(數據訪問層也就是從數據庫中查數據),Service層(業務邏輯層,也就是處理好數據),Controller層(視圖控制層,在前后端分離的情況下就是寫接口響應前端請求)和前端的 view(視圖層),為啥要搞分層咧,說到底就是要解耦合,提高拓展性和維護性,寫代碼的時候,思路清晰一點,后面改代碼的時候也知道要改哪邊。
但是我們這次只是涉及后臺的,視圖層我們就不用管了,只需看前面的就行了。
2 分層首先看一下項目結構哈
│ app.js │ package.json │ README.md │ ├─.idea │ │ express-project.iml │ │ misc.xml │ │ modules.xml │ │ vcs.xml │ │ watcherTasks.xml │ │ workspace.xml │ │ │ └─inspectionProfiles ├─bin │ www │ ├─config │ db.json │ ├─dao │ BaseDao.js │ UserDao.js │ ├─models │ user.js │ ├─public │ ├─images │ ├─javascripts │ └─stylesheets │ style.css │ ├─routes │ index.js │ users.js │ ├─services │ UserService.js │ ├─utils │ db-util.js │ └─views error.jade index.jade layout.jade
按照分層思想,我們新建幾個文件夾哈,首先是 Model層的 models 文件夾,dao 層的 dao 文件夾,service 層的 services 文件夾,controller 層的話就用原來的 routes 文件夾就可以了,為了方便,我加了一個全局配置的 config 文件夾和工具函數 utils 文件夾。具體項目如下,我們從最底層開始來一個一個來分析
2.1 config這個就放著各種配置文件,例如我的 db.json 里面就放了mongodb 的端口號,數據庫名那些,反正就是各種配置啦
2.2 utils這個就是有一些創建型的方法或者其他公共方法,像創建數據庫連接池的方法我就放在這邊的 db-util 里面了。
2.3 models實體層,針對 mongodb 來說,一個集合對應一個 model,然后都是這樣的形式啦。
const mongoose = require("mongoose"); const { mongoClient } = require("../utils/db-util"); // 創建 user Schema const user = new mongoose.Schema({ name: String, id: String, },{versionKey: false}); /*model 的參數1 導出的模塊名, 參數2 創建的 Schema, 參數2 指定數據庫中的集合的名字,若不加的,則抹默認取‘第一個參數s’的集合*/ let User = mongoClient.model("User", user, "user"); module.exports = User;2.4 dao
創建完實體層,接下來就是 dao 層了,這邊我封裝了一個 BaseDao,基本的數據庫操作都有了,后面我們創建其他 dao 的時候就很舒服啦,直接繼承一下 BaseDao 就好了。例如下面的這個 UserDao:
let BaseDao = require("./BaseDao"); // 導入對應的實體 let User = require("../models/user"); class UserDao extends BaseDao{ constructor() { super(User); } //如果有啥特殊需求的話,自己再重寫方法咯 } module.exports = UserDao;
這樣就寫好了一個基本的 dao 了,增刪改查這些他都從 BaseDao 中繼承了,
2.5 servicesservice 層是業務邏輯層,這么寫就看你項目的業務啦。我下面就簡單些一個查詢所有 user 數據的方法啦。
const UserDao = require("../dao/UserDao"); let userDao = new UserDao(); class UserService { async getUserList() { try { // 調用 dao 層查詢數據 let userList = await userDao.findAll(); return userList; } catch (err) { console.log(`getUserList error--> ${error}`); return error; } } } module.exports = UserService;2.6 routes
controller 層,寫接口用,這個寫起來簡單,就拿一下 service 層的數據返回就可以啦。
var express = require("express"); var router = express.Router(); const UserService = require("../services/UserService"); let userService = new UserService(); /* GET users listing. */ router.get("/", function(req, res, next) { userService.getUserList().then((data)=>{ res.json({ code:0, msg:"OK", data:data }) }); // res.send("respond with a resource"); }); router.get("/login",(req,res,next)=>{ res.json({ code:0, msg:"OK", data:{result:true} }) }); module.exports = router;
然后這邊的話,我有一個想法,就是想著每次多一個路由實例(controller)的時候,就要往 app.js 里面導入并引入,覺得這樣 controller 多了的時候,app.js 里面代碼會很多,所以就想著把模塊導入的代碼移到 routes 文件夾里面的 index.js 里面來,app.js 就引入個 index 就好啦。所以就有了下面 index.js 的代碼。
var express = require("express"); var router = express.Router(); /* GET home page. */ router.get("/", function(req, res, next) { res.render("index", { title: "Express" }); }); // user 路由模塊 // 當我在 user 文件里面寫一個 "/login" 的時候,前端訪問就要訪問 "/user/login" router.use("/user", require("./users")); module.exports = router;
至此,全文就結束啦,對于 express 框架的分層實踐如果有更好的建議或者我這樣分層有啥問題的話,歡迎在在下方留言哈,大家一起學習一下。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/99863.html
摘要:總結我覺得,以后基于的全棧式開發的模式將會越來越流行,這也會引領前端步入工程化時代。歡迎繼續關注本博的更新中間層實踐一基于的全棧式開發中間層實踐二搭建項目框架中間層實踐三配置中間層實踐四模板引擎中間層實踐五中間層的邏輯處理 版權聲明:更多文章請訪問我的個人站Keyon Y,轉載請注明出處。 前言 近期公司有個新項目,由于后端人手不足,我果斷的提議用node中間層的方案,得到了老大的支持...
摘要:接下來我們將逐步的減少這個鏡像的體積。優化生產環境鏡像使用鏡像大幅減小鏡像體積的最簡單和最快的方法是選擇一個小得多的基本鏡像。使用多階段構建可以充分利用鏡像的緩存,大大減少最終部署到生產環境的時間。 關注作者github每日一道面試題詳解 你討厭部署你的應用程序花費很長時間嗎? 對于單個容器來說,超過gb并不是最佳實踐。每次部署新版本時都要處理數十億字節,這對我們來說并不太合適。 本文...
摘要:文件這個是項目的入口文件,這邊有著項目的一下配置,也在此整合了項目的模塊,其中要注意的就是里面關于路由模塊的配置了。后面要再想加其他路由模塊的時候,就按照上面先引入路由模塊,再用設置好地址,后面就可以用了。 前言 想必很多小伙伴開始學 node 的時候想搞個項目出來卻不知道怎么下手吧,這個教程的話就是教大家用 express 框架簡單粗暴搭建一個可以用的后臺出來,然后關于 node 和...
摘要:的最后一個大招就是替換一些傳統的服務端語言,例如,,等,在業務層上面使用來開發服務端完全不成問題。更多的的使用細節和技巧建議關注美團博客大搜車論壇下一篇我們開啟如何結合和搭建一個開發環境和項目目錄 往期回顧 前面2期都講得是瀏覽器端的東西比較多,包括Webpack,雖然是Node處理的,但是還是瀏覽器端用的多,對于現在的前端開發來說,不懂一點服務端的東西,簡直沒辦法活,一般的招聘要求都...
摘要:淺談秒殺系統架構設計后端掘金秒殺是電子商務網站常見的一種營銷手段。這兩個項目白話網站架構演進后端掘金這是白話系列的文章。 淺談秒殺系統架構設計 - 后端 - 掘金秒殺是電子商務網站常見的一種營銷手段。 不要整個系統宕機。 即使系統故障,也不要將錯誤數據展示出來。 盡量保持公平公正。 實現效果 秒殺開始前,搶購按鈕為活動未開始。 秒殺開始時,搶購按鈕可以點擊下單。 秒殺結束后,按鈕按鈕變...
閱讀 3933·2021-11-24 10:46
閱讀 1821·2021-11-16 11:44
閱讀 2300·2021-09-22 16:02
閱讀 1409·2019-08-30 15:55
閱讀 1136·2019-08-30 12:46
閱讀 570·2019-08-28 18:31
閱讀 2767·2019-08-26 18:38
閱讀 1103·2019-08-23 16:51