成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

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

wdzgege / 2960人閱讀

摘要:前言上次我們搭建了一個(gè)基本的后臺(tái),但是這樣的項(xiàng)目結(jié)構(gòu)的可擴(kuò)展性,維護(hù)性和代碼復(fù)用性都不是很好,參照之前學(xué)習(xí)時(shí)候的四層架構(gòu)設(shè)計(jì),用分層的思想來(lái)對(duì)進(jìn)行一點(diǎn)小優(yōu)化,進(jìn)一步提高代碼的可拓展性。實(shí)體層針對(duì)來(lái)說(shuō),一個(gè)集合對(duì)應(yīng)一個(gè),然后都是這樣的形式啦。

前言 上次我們搭建了一個(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è)查詢(xún)所有 user 數(shù)據(jù)的方法啦。

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

let userDao = new UserDao();

class UserService {
  async getUserList() {
    try {
      // 調(diào)用 dao 層查詢(xún)數(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í)一下。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/99863.html

相關(guān)文章

  • Node中間層實(shí)踐(一)——基于NodeJS的全棧式開(kāi)發(fā)

    摘要:總結(jié)我覺(jué)得,以后基于的全棧式開(kāi)發(fā)的模式將會(huì)越來(lái)越流行,這也會(huì)引領(lǐng)前端步入工程化時(shí)代。歡迎繼續(xù)關(guān)注本博的更新中間層實(shí)踐一基于的全棧式開(kāi)發(fā)中間層實(shí)踐二搭建項(xiàng)目框架中間層實(shí)踐三配置中間層實(shí)踐四模板引擎中間層實(shí)踐五中間層的邏輯處理 版權(quán)聲明:更多文章請(qǐng)?jiān)L問(wèn)我的個(gè)人站Keyon Y,轉(zhuǎn)載請(qǐng)注明出處。 前言 近期公司有個(gè)新項(xiàng)目,由于后端人手不足,我果斷的提議用node中間層的方案,得到了老大的支持...

    warkiz 評(píng)論0 收藏0
  • Node.js docker 鏡像體積優(yōu)化實(shí)踐

    摘要:接下來(lái)我們將逐步的減少這個(gè)鏡像的體積。優(yōu)化生產(chǎn)環(huán)境鏡像使用鏡像大幅減小鏡像體積的最簡(jiǎn)單和最快的方法是選擇一個(gè)小得多的基本鏡像。使用多階段構(gòu)建可以充分利用鏡像的緩存,大大減少最終部署到生產(chǎn)環(huán)境的時(shí)間。 關(guān)注作者github每日一道面試題詳解 你討厭部署你的應(yīng)用程序花費(fèi)很長(zhǎng)時(shí)間嗎? 對(duì)于單個(gè)容器來(lái)說(shuō),超過(guò)gb并不是最佳實(shí)踐。每次部署新版本時(shí)都要處理數(shù)十億字節(jié),這對(duì)我們來(lái)說(shuō)并不太合適。 本文...

    wenhai.he 評(píng)論0 收藏0
  • 手把手用 express 搭建后臺(tái)

    摘要:文件這個(gè)是項(xiàng)目的入口文件,這邊有著項(xiàng)目的一下配置,也在此整合了項(xiàng)目的模塊,其中要注意的就是里面關(guān)于路由模塊的配置了。后面要再想加其他路由模塊的時(shí)候,就按照上面先引入路由模塊,再用設(shè)置好地址,后面就可以用了。 前言 想必很多小伙伴開(kāi)始學(xué) node 的時(shí)候想搞個(gè)項(xiàng)目出來(lái)卻不知道怎么下手吧,這個(gè)教程的話就是教大家用 express 框架簡(jiǎn)單粗暴搭建一個(gè)可以用的后臺(tái)出來(lái),然后關(guān)于 node 和...

    Render 評(píng)論0 收藏0
  • 如何打造一個(gè)令人愉悅的前端開(kāi)發(fā)環(huán)境(三)

    摘要:的最后一個(gè)大招就是替換一些傳統(tǒng)的服務(wù)端語(yǔ)言,例如,,等,在業(yè)務(wù)層上面使用來(lái)開(kāi)發(fā)服務(wù)端完全不成問(wèn)題。更多的的使用細(xì)節(jié)和技巧建議關(guān)注美團(tuán)博客大搜車(chē)論壇下一篇我們開(kāi)啟如何結(jié)合和搭建一個(gè)開(kāi)發(fā)環(huán)境和項(xiàng)目目錄 往期回顧 前面2期都講得是瀏覽器端的東西比較多,包括Webpack,雖然是Node處理的,但是還是瀏覽器端用的多,對(duì)于現(xiàn)在的前端開(kāi)發(fā)來(lái)說(shuō),不懂一點(diǎn)服務(wù)端的東西,簡(jiǎn)直沒(méi)辦法活,一般的招聘要求都...

    cgh1999520 評(píng)論0 收藏0
  • 架構(gòu) - 收藏集 - 掘金

    摘要:淺談秒殺系統(tǒng)架構(gòu)設(shè)計(jì)后端掘金秒殺是電子商務(wù)網(wǎng)站常見(jiàn)的一種營(yíng)銷(xiāo)手段。這兩個(gè)項(xiàng)目白話網(wǎng)站架構(gòu)演進(jìn)后端掘金這是白話系列的文章。 淺談秒殺系統(tǒng)架構(gòu)設(shè)計(jì) - 后端 - 掘金秒殺是電子商務(wù)網(wǎng)站常見(jiàn)的一種營(yíng)銷(xiāo)手段。 不要整個(gè)系統(tǒng)宕機(jī)。 即使系統(tǒng)故障,也不要將錯(cuò)誤數(shù)據(jù)展示出來(lái)。 盡量保持公平公正。 實(shí)現(xiàn)效果 秒殺開(kāi)始前,搶購(gòu)按鈕為活動(dòng)未開(kāi)始。 秒殺開(kāi)始時(shí),搶購(gòu)按鈕可以點(diǎn)擊下單。 秒殺結(jié)束后,按鈕按鈕變...

    Riddler 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<