Node+Express搭建個(gè)人博客(純后端)-基礎(chǔ)項(xiàng)目搭建(四)

基礎(chǔ)項(xiàng)目搭建

在上一篇文章對(duì)Express腳手架進(jìn)行了簡(jiǎn)單分析和改造之后,接下來(lái)開(kāi)始搭建自己的項(xiàng)目。

目錄結(jié)構(gòu)

目錄結(jié)構(gòu)概覽

項(xiàng)目搭建的第一步潜必,是約定項(xiàng)目的目錄結(jié)構(gòu),項(xiàng)目的目錄結(jié)構(gòu)如下:

express-blog
│  CHANGELOG.md
│  package.json
│  README.md
│  server.js 
│      
├─app
│  ├─apidoc
│  │          
│  ├─controllers
│  │      
│  ├─middlewares
│  │      
│  ├─models
│  │      
│  ├─myutil
│  │
│  ├─public
│  │          
│  ├─routes
│  │      
│  └─services
│          
├─build
│                  
├─config
│      
├─logs
│                    
├─resource
│
└─test

目錄結(jié)構(gòu)說(shuō)明

目錄結(jié)構(gòu)說(shuō)明如下:

  • CHANGELOG.md項(xiàng)目更新日志的記錄文件沃但。
  • server.js程序的初始化和啟動(dòng)文件磁滚。
  • app/apidoc/**用于編寫(xiě)接口文檔說(shuō)明,然后使用apidoc生成接口文檔。
  • app/controller/**用于接收和處理用戶(hù)輸入的參數(shù)垂攘,然后將處理結(jié)果返回维雇。
  • aoo/middleware/**用于編寫(xiě)中間件函數(shù)。
  • app/model/**用于編寫(xiě)定義數(shù)據(jù)庫(kù)相關(guān)的文件晒他。
  • app/myutil/**用于存放編寫(xiě)的工具函數(shù)吱型。
  • app/public/**用于存放項(xiàng)目的靜態(tài)資源。
  • app/routes/routes.js用于添加和配置路由規(guī)則陨仅。
  • app/service/**用于編寫(xiě)業(yè)務(wù)邏輯代碼唁影,可供controller層調(diào)用。
  • build/**用于項(xiàng)目初次部署時(shí)初始化基礎(chǔ)數(shù)據(jù)掂名,比如初始化管理員据沈。
  • config/**用于項(xiàng)目的相關(guān)配置文件,比如數(shù)據(jù)庫(kù)配置
  • logs/**用于存放程序的請(qǐng)求日志饺蔑、錯(cuò)誤日志等日志文件锌介。
  • resource/**用于存放文檔資料。
  • test/**用于單元測(cè)試猾警。

看到這里孔祸,不知道是否看出來(lái)些什么沒(méi)有,我是盡力在向Egg.js框架的目錄結(jié)構(gòu)靠攏发皿,我曾使用egg框架完成過(guò)兩個(gè)web項(xiàng)目崔慧,使用下來(lái)的最大感受就是省心,根據(jù)egg框架核心開(kāi)發(fā)人員的說(shuō)法穴墅,阿里內(nèi)部有很多個(gè)基于egg框架的項(xiàng)目在運(yùn)行惶室,起碼可以得出一點(diǎn),這個(gè)框架是經(jīng)過(guò)多個(gè)項(xiàng)目實(shí)踐之后的一個(gè)成果玄货,那我們對(duì)egg框架的一點(diǎn)借鑒也會(huì)是好的借鑒【手動(dòng)捂臉】皇钞。

基礎(chǔ)項(xiàng)目搭建

現(xiàn)在,開(kāi)始按照上面的目錄結(jié)構(gòu)松捉,開(kāi)始搭建項(xiàng)目夹界。

生成啟動(dòng)文件

按照上一篇文章的設(shè)想,首先創(chuàng)建目錄express-blog,將其作為項(xiàng)目的根目錄隘世,然后將項(xiàng)目的初始化文件和啟動(dòng)文件合二為一可柿,在項(xiàng)目的根目錄下創(chuàng)建app.js文件,代碼如下:

'use strict'
const express = require('express')
const path = require('path')
const app = express()
const bodyParser = require('body-parser')

// 配置靜態(tài)文件
app.use(express.static(path.join(__dirname, 'app/public')))
// 配置apidoc
app.use('/apidoc', express.static(path.join(__dirname, 'app/public/apidoc/')))

// 請(qǐng)求體解析中間件
app.use(bodyParser.urlencoded({ extended: true }))
app.use(bodyParser.json())

app.listen(3000)
console.log('express-blog server started on: ' + 3000)

創(chuàng)建完成app.js文件之后丙者,我們還需要安裝文件中依賴(lài)的npm包复斥,執(zhí)行以下命令:

npm init
<!--無(wú)所謂項(xiàng)目基礎(chǔ)信息的話(huà),執(zhí)行完上面的命令之后可以一直回車(chē)蔓钟,當(dāng)然永票,還是建議認(rèn)真填寫(xiě)-->
npm install --save-dev express

這時(shí)候,項(xiàng)目的啟動(dòng)文件已經(jīng)創(chuàng)建成功,依賴(lài)包也安裝完畢侣集,可以啟動(dòng)項(xiàng)目了键俱,就是這么簡(jiǎn)單,執(zhí)行以下命令:

node server.js

看到控制臺(tái)輸出express-blog server started on: 4000世分,表明我們的項(xiàng)目成功運(yùn)行编振,項(xiàng)目初始化的第一步完成。

完成第一個(gè)接口

項(xiàng)目已經(jīng)可以成功運(yùn)行臭埋,接下來(lái)要按照以上的目錄結(jié)構(gòu)踪央,完成項(xiàng)目的第一個(gè)接口,首先瓢阴,在項(xiàng)目的根目錄下創(chuàng)建app目錄畅蹂,一般的代碼文件都會(huì)放置于該目錄下。然后根據(jù)以上的目錄結(jié)構(gòu)荣恐,創(chuàng)建app目錄下的其他目錄液斜,待app下的目錄創(chuàng)建完畢之后,開(kāi)始編寫(xiě)代碼叠穆。

在項(xiàng)目中少漆,會(huì)將封裝好的同類(lèi)函數(shù)存放于目錄的index.js文件中,然后導(dǎo)出硼被,以供其他模塊調(diào)用示损,在其他模塊調(diào)用該目錄時(shí)會(huì)默認(rèn)加載該目錄下的index.js具體原理見(jiàn)Node.js官方文檔-module (模塊)

同時(shí)嚷硫,在項(xiàng)目中检访,會(huì)使用ES6及ES6+的語(yǔ)法糖,比如Promise论巍、classasync/await等烛谊,如果不理解,可以去看阮一峰老師的ECMAScript 6 入門(mén)嘉汰,快速入口:

controller層

創(chuàng)建app/controllers/users.js文件,代碼如下:

'use strict'
const Services = require('../services')
class UsersController {
  async create (req, res) {
    const paramas = req.body
    const result = await Services.users.addUser(paramas)
    res.send(result)
  }
}

module.exports = new UsersController()

創(chuàng)建app/controllers/index.js文件状勤,代碼如下:

'use strict'

const controllers = {}
controllers.users = require('./users')

module.exports = controllers

service層

創(chuàng)建app/services/users.js文件鞋怀,代碼如下:

'use strict'
class UserService {
  async addUser (data) {
    return 'create success'
  }
}

module.exports = new UserService()

創(chuàng)建app/services/index.js文件,代碼如下:

'use strict'
const Services = {}

Services.users = require('./users')

module.exports = Services

middlewares層

創(chuàng)建app/middlewares/not-find.js文件持搜,代碼如下:

'use strict'
// 404錯(cuò)誤處理中間件

module.exports = (req, res, next) => {
  res.send('404,您訪(fǎng)問(wèn)的路由不存在密似!')
}

創(chuàng)建app/middlewares/index.js文件,代碼如下:

'use strict'
const middleware = {}

middleware.notFind = require('./not-find')

module.exports = middleware

routes層

創(chuàng)建app/routes/routes.js文件葫盼,同時(shí)注冊(cè)上面的404錯(cuò)誤處理中間件残腌,代碼如下:

'use strict'

const Controllers = require('../controllers')
const middleware = require('../middlewares')

module.exports = function (app) {
  app.post('/users', Controllers.users.create)

  app.use(middleware.notFind)
}

修改app.js文件,引用路由文件,并傳遞app對(duì)象給routes層抛猫,添加的代碼如下:

// 引入路由
const routes = require('./app/routes/routes')
// 注冊(cè)路由
routes(app)

注:該代碼要添加在生成app實(shí)例的代碼之后蟆盹,即const app = express()之后。

測(cè)試接口

至此闺金,第一個(gè)接口完成逾滥,當(dāng)然,這只是一個(gè)接口败匹,沒(méi)有任何邏輯寨昙,但是也夠了,邏輯可以后面再添加掀亩。接下來(lái)舔哪,對(duì)接口做簡(jiǎn)單測(cè)試。

首先槽棍,node server.js捉蚤,啟動(dòng)程序。

然后刹泄,打開(kāi)postman外里,發(fā)送POST請(qǐng)求到localhost:4000/users,發(fā)現(xiàn)返回create success特石,看來(lái)接口是生效的盅蝗。

然后再發(fā)送POST請(qǐng)求到localhost:4000/users1212,發(fā)現(xiàn)返回404,您訪(fǎng)問(wèn)的路由不存在姆蘸!墩莫,看來(lái)404錯(cuò)誤處理中間件也是生效的。

小結(jié)

本文主要依據(jù)上一篇文章的分析逞敷,初始化了自己的項(xiàng)目狂秦,完成了一個(gè)沒(méi)有任何邏輯的接口(邏輯目前不重要),同時(shí)很好的完成了各層分離的目的推捐。接下來(lái)會(huì)在此基礎(chǔ)上裂问,使用版本控制工具git完成一個(gè)項(xiàng)目相對(duì)完整的git操作流程。

下面附上項(xiàng)目的github地址:

項(xiàng)目地址

我的個(gè)人博客:

毛浩先生的個(gè)人博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末牛柒,一起剝皮案震驚了整個(gè)濱河市堪簿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌皮壁,老刑警劉巖椭更,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蛾魄,居然都是意外死亡虑瀑,警方通過(guò)查閱死者的電腦和手機(jī)湿滓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)舌狗,“玉大人叽奥,你說(shuō)我怎么就攤上這事“芽洌” “怎么了而线?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)恋日。 經(jīng)常有香客問(wèn)我膀篮,道長(zhǎng),這世上最難降的妖魔是什么岂膳? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任誓竿,我火速辦了婚禮,結(jié)果婚禮上谈截,老公的妹妹穿的比我還像新娘筷屡。我一直安慰自己,他們只是感情好簸喂,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布毙死。 她就那樣靜靜地躺著,像睡著了一般喻鳄。 火紅的嫁衣襯著肌膚如雪扼倘。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天除呵,我揣著相機(jī)與錄音再菊,去河邊找鬼。 笑死颜曾,一個(gè)胖子當(dāng)著我的面吹牛纠拔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播泛豪,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼稠诲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了诡曙?” 一聲冷哼從身側(cè)響起吕粹,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎岗仑,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體聚请,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡荠雕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年稳其,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炸卑。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡既鞠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盖文,到底是詐尸還是另有隱情嘱蛋,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布五续,位于F島的核電站洒敏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏疙驾。R本人自食惡果不足惜凶伙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望它碎。 院中可真熱鬧函荣,春花似錦、人聲如沸扳肛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)挖息。三九已至金拒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旋讹,已是汗流浹背殖蚕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沉迹,地道東北人睦疫。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像鞭呕,于是被迫代替她去往敵國(guó)和親蛤育。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容