使用express怎么實現項目分層,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
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 services
service 層是業務邏輯層,這么寫就看你項目的業務啦。我下面就簡單些一個查詢所有 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怎么實現項目分層的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。