欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

express 項(xiàng)目分層實(shí)踐詳解

 更新時(shí)間:2018年12月10日 11:10:58   作者:小紅帽  
這篇文章主要介紹了express 項(xiàng)目分層實(shí)踐詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

前言

上次我們搭建了一個(gè)基本的 express 后臺(tái),但是這樣的項(xiàng)目結(jié)構(gòu)的可擴(kuò)展性,維護(hù)性和代碼復(fù)用性都不是很好,參照之前學(xué)習(xí) JavaWeb 時(shí)候的四層架構(gòu)設(shè)計(jì),用分層的思想來(lái)對(duì) express 進(jìn)行一點(diǎn)小優(yōu)化,進(jìn)一步提高代碼的可拓展性。本文的源代碼在 Github 上,建議看著代碼來(lái)看這篇文章。

1 四(五)層結(jié)構(gòu)概念

這個(gè)就簡(jiǎn)單說(shuō)一下,所謂四層架構(gòu)就是 Model實(shí)體層,Dao層(數(shù)據(jù)訪問(wèn)層也就是從數(shù)據(jù)庫(kù)中查數(shù)據(jù)),Service層(業(yè)務(wù)邏輯層,也就是處理好數(shù)據(jù)),Controller層(視圖控制層,在前后端分離的情況下就是寫(xiě)接口響應(yīng)前端請(qǐng)求)和前端的 view(視圖層),為啥要搞分層咧,說(shuō)到底就是要解耦合,提高拓展性和維護(hù)性,寫(xiě)代碼的時(shí)候,思路清晰一點(diǎn),后面改代碼的時(shí)候也知道要改哪邊。

但是我們這次只是涉及后臺(tái)的,視圖層我們就不用管了,只需看前面的就行了。

2 分層

首先看一下項(xiàng)目結(jié)構(gòu)哈

│ 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

按照分層思想,我們新建幾個(gè)文件夾哈,首先是 Model層的 models 文件夾,dao 層的 dao 文件夾,service 層的 services 文件夾,controller 層的話就用原來(lái)的 routes 文件夾就可以了,為了方便,我加了一個(gè)全局配置的 config 文件夾和工具函數(shù) utils 文件夾。具體項(xiàng)目如下,我們從最底層開(kāi)始來(lái)一個(gè)一個(gè)來(lái)分析

2.1 config

這個(gè)就放著各種配置文件,例如我的 db.json 里面就放了mongodb 的端口號(hào),數(shù)據(jù)庫(kù)名那些,反正就是各種配置啦

2.2 utils

這個(gè)就是有一些創(chuàng)建型的方法或者其他公共方法,像創(chuàng)建數(shù)據(jù)庫(kù)連接池的方法我就放在這邊的 db-util 里面了。

2.3 models

實(shí)體層,針對(duì) mongodb 來(lái)說(shuō),一個(gè)集合對(duì)應(yīng)一個(gè) model,然后都是這樣的形式啦。

const mongoose = require('mongoose');
const { mongoClient } = require('../utils/db-util');

// 創(chuàng)建 user Schema
const user = new mongoose.Schema({
 name: String,
 id: String,
},{versionKey: false});

/*model 的參數(shù)1 導(dǎo)出的模塊名,
參數(shù)2 創(chuàng)建的 Schema,
參數(shù)2 指定數(shù)據(jù)庫(kù)中的集合的名字,若不加的,則抹默認(rèn)取‘第一個(gè)參數(shù)s'的集合*/
let User = mongoClient.model('User', user, 'user');

module.exports = User;

2.4 dao

創(chuàng)建完實(shí)體層,接下來(lái)就是 dao 層了,這邊我封裝了一個(gè) BaseDao,基本的數(shù)據(jù)庫(kù)操作都有了,后面我們創(chuàng)建其他 dao 的時(shí)候就很舒服啦,直接繼承一下 BaseDao 就好了。例如下面的這個(gè) UserDao:

let BaseDao = require('./BaseDao');
// 導(dǎo)入對(duì)應(yīng)的實(shí)體
let User = require('../models/user');

class UserDao extends BaseDao{
 constructor() {
 super(User);
 }
 //如果有啥特殊需求的話,自己再重寫(xiě)方法咯
}

module.exports = UserDao;

這樣就寫(xiě)好了一個(gè)基本的 dao 了,增刪改查這些他都從 BaseDao 中繼承了,

2.5 services

service 層是業(yè)務(wù)邏輯層,這么寫(xiě)就看你項(xiàng)目的業(yè)務(wù)啦。我下面就簡(jiǎn)單些一個(gè)查詢所有 user 數(shù)據(jù)的方法啦。

const UserDao = require('../dao/UserDao');

let userDao = new UserDao();

class UserService {
 async getUserList() {
 try {
  // 調(diào)用 dao 層查詢數(shù)據(jù)
  let userList = await userDao.findAll();
  return userList;
 } catch (err) {
  console.log(`getUserList error--> ${error}`);
  return error;
 }
 }
}
module.exports = UserService;

2.6 routes

controller 層,寫(xiě)接口用,這個(gè)寫(xiě)起來(lái)簡(jiǎn)單,就拿一下 service 層的數(shù)據(jù)返回就可以啦。

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;

然后這邊的話,我有一個(gè)想法,就是想著每次多一個(gè)路由實(shí)例(controller)的時(shí)候,就要往 app.js 里面導(dǎo)入并引入,覺(jué)得這樣 controller 多了的時(shí)候,app.js 里面代碼會(huì)很多,所以就想著把模塊導(dǎo)入的代碼移到 routes 文件夾里面的 index.js 里面來(lái),app.js 就引入個(gè) 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 路由模塊
// 當(dāng)我在 user 文件里面寫(xiě)一個(gè) '/login' 的時(shí)候,前端訪問(wèn)就要訪問(wèn) '/user/login'
router.use('/user', require('./users'));
module.exports = router;

至此,全文就結(jié)束啦,對(duì)于 express 框架的分層實(shí)踐如果有更好的建議或者我這樣分層有啥問(wèn)題的話,歡迎在在下方留言哈,大家一起學(xué)習(xí)一下。也希望大家多多支持腳本之家。

相關(guān)文章

  • Node.js環(huán)境下Koa2添加travis ci持續(xù)集成工具的方法

    Node.js環(huán)境下Koa2添加travis ci持續(xù)集成工具的方法

    這篇文章主要給大家介紹了在Node.js環(huán)境下Koa2添加travis ci持續(xù)集成工具的方法,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。
    2017-06-06
  • Node.js的Koa實(shí)現(xiàn)JWT用戶認(rèn)證方法

    Node.js的Koa實(shí)現(xiàn)JWT用戶認(rèn)證方法

    本篇文章主要介紹了Node.js的Koa實(shí)現(xiàn)JWT用戶認(rèn)證方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Node.js的文件權(quán)限及讀寫(xiě)flag詳解

    Node.js的文件權(quán)限及讀寫(xiě)flag詳解

    Node.js對(duì)文件的讀寫(xiě)還是相當(dāng)靈活的,因?yàn)樽约豪鲜怯洸蛔∥募蚰夸洐?quán)限的數(shù)值表達(dá)和字符表達(dá)。所以整理出這篇文章,方便以后查閱,下面來(lái)一起看看吧。
    2016-10-10
  • 詳解redis在nodejs中的應(yīng)用

    詳解redis在nodejs中的應(yīng)用

    本篇文章給大家詳細(xì)分析了redis在nodejs中的應(yīng),對(duì)此知識(shí)點(diǎn)有興趣的朋友可以跟著學(xué)習(xí)下。
    2018-05-05
  • Node.JS更改Windows注冊(cè)表Regedit的方法小結(jié)

    Node.JS更改Windows注冊(cè)表Regedit的方法小結(jié)

    注冊(cè)表是windows操作系統(tǒng)中的一個(gè)核心數(shù)據(jù)庫(kù),這里介紹一些通過(guò)node.js操作注冊(cè)表的幾種方法,感興趣的朋友參考下吧
    2017-08-08
  • 如何從零開(kāi)始手寫(xiě)Koa2框架

    如何從零開(kāi)始手寫(xiě)Koa2框架

    這篇文章主要介紹了如何從零開(kāi)始手寫(xiě)Koa2框架,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 用nodejs實(shí)現(xiàn)json和jsonp服務(wù)的方法

    用nodejs實(shí)現(xiàn)json和jsonp服務(wù)的方法

    本篇文章主要介紹了用nodejs實(shí)現(xiàn)json和jsonp服務(wù)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • NodeJs?Express路由使用流程解析

    NodeJs?Express路由使用流程解析

    路由路徑和請(qǐng)求方法一起定義了請(qǐng)求的端點(diǎn),它可以是字符串、字符串模式或者正則表達(dá)式。后端在獲取路由后,可通過(guò)一系列類(lèi)似中間件的函數(shù)去執(zhí)行事務(wù)
    2023-01-01
  • 利用Node.js對(duì)文件進(jìn)行重命名

    利用Node.js對(duì)文件進(jìn)行重命名

    最近工作中遇到了對(duì)文件進(jìn)行重命名的需求,后通過(guò)node.js實(shí)現(xiàn)了,所以下面這篇文章主要給大家介紹了利用Node.js對(duì)文件進(jìn)行重命名的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-03-03
  • nodejs如何獲取時(shí)間戳與時(shí)間差

    nodejs如何獲取時(shí)間戳與時(shí)間差

    本文詳細(xì)介紹了nodejs獲取時(shí)間戳與時(shí)間差的多種方法,對(duì)平時(shí)nodejs的使用很有幫助,下面一起來(lái)看看吧。
    2016-08-08

最新評(píng)論