基礎(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
论巍、class
和async/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地址:
我的個(gè)人博客: