国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

express 項目分層實踐詳解

2019-11-19 12:22:22
字體:
來源:轉載
供稿:網友

前言

上次我們搭建了一個基本的 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 Schemaconst 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 框架的分層實踐如果有更好的建議或者我這樣分層有啥問題的話,歡迎在在下方留言哈,大家一起學習一下。也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 斗六市| 温州市| 新竹市| 通道| 宁晋县| 叙永县| 随州市| 永嘉县| 大同县| 黔西县| 普兰店市| 福清市| 涟源市| 壤塘县| 清流县| 如东县| 乌兰浩特市| 江津市| 枝江市| 乳山市| 昌图县| 绥江县| 项城市| 色达县| 虹口区| 大城县| 洞头县| 兰考县| 富民县| 永和县| 依安县| 利辛县| 南城县| 双鸭山市| 九江市| 东丽区| 青阳县| 仙桃市| 分宜县| 长丰县| 卫辉市|