基礎(chǔ)項目搭建
在上一篇文章對Express腳手架進行了簡單分析和改造之后,接下來開始搭建自己的項目。
目錄結(jié)構(gòu)
目錄結(jié)構(gòu)概覽
項目搭建的第一步,是約定項目的目錄結(jié)構(gòu),項目的目錄結(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)說明
目錄結(jié)構(gòu)說明如下:
-
CHANGELOG.md項目更新日志的記錄文件。 -
server.js程序的初始化和啟動文件。 -
app/apidoc/**用于編寫接口文檔說明,然后使用apidoc生成接口文檔。 -
app/controller/**用于接收和處理用戶輸入的參數(shù),然后將處理結(jié)果返回。 -
aoo/middleware/**用于編寫中間件函數(shù)。 -
app/model/**用于編寫定義數(shù)據(jù)庫相關(guān)的文件。 -
app/myutil/**用于存放編寫的工具函數(shù)。 -
app/public/**用于存放項目的靜態(tài)資源。 -
app/routes/routes.js用于添加和配置路由規(guī)則。 -
app/service/**用于編寫業(yè)務(wù)邏輯代碼,可供controller層調(diào)用。 -
build/**用于項目初次部署時初始化基礎(chǔ)數(shù)據(jù),比如初始化管理員。 -
config/**用于項目的相關(guān)配置文件,比如數(shù)據(jù)庫配置 -
logs/**用于存放程序的請求日志、錯誤日志等日志文件。 -
resource/**用于存放文檔資料。 -
test/**用于單元測試。
看到這里,不知道是否看出來些什么沒有,我是盡力在向Egg.js框架的目錄結(jié)構(gòu)靠攏,我曾使用egg框架完成過兩個web項目,使用下來的最大感受就是省心,根據(jù)egg框架核心開發(fā)人員的說法,阿里內(nèi)部有很多個基于egg框架的項目在運行,起碼可以得出一點,這個框架是經(jīng)過多個項目實踐之后的一個成果,那我們對egg框架的一點借鑒也會是好的借鑒【手動捂臉】。
基礎(chǔ)項目搭建
現(xiàn)在,開始按照上面的目錄結(jié)構(gòu),開始搭建項目。
生成啟動文件
按照上一篇文章的設(shè)想,首先創(chuàng)建目錄express-blog,將其作為項目的根目錄,然后將項目的初始化文件和啟動文件合二為一,在項目的根目錄下創(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/')))
// 請求體解析中間件
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文件之后,我們還需要安裝文件中依賴的npm包,執(zhí)行以下命令:
npm init
<!--無所謂項目基礎(chǔ)信息的話,執(zhí)行完上面的命令之后可以一直回車,當然,還是建議認真填寫-->
npm install --save-dev express
這時候,項目的啟動文件已經(jīng)創(chuàng)建成功,依賴包也安裝完畢,可以啟動項目了,就是這么簡單,執(zhí)行以下命令:
node server.js
看到控制臺輸出express-blog server started on: 4000,表明我們的項目成功運行,項目初始化的第一步完成。
完成第一個接口
項目已經(jīng)可以成功運行,接下來要按照以上的目錄結(jié)構(gòu),完成項目的第一個接口,首先,在項目的根目錄下創(chuàng)建app目錄,一般的代碼文件都會放置于該目錄下。然后根據(jù)以上的目錄結(jié)構(gòu),創(chuàng)建app目錄下的其他目錄,待app下的目錄創(chuàng)建完畢之后,開始編寫代碼。
在項目中,會將封裝好的同類函數(shù)存放于目錄的index.js文件中,然后導出,以供其他模塊調(diào)用,在其他模塊調(diào)用該目錄時會默認加載該目錄下的index.js具體原理見Node.js官方文檔-module (模塊)。
同時,在項目中,會使用ES6及ES6+的語法糖,比如Promise、class和async/await等,如果不理解,可以去看阮一峰老師的ECMAScript 6 入門,快速入口:
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錯誤處理中間件
module.exports = (req, res, next) => {
res.send('404,您訪問的路由不存在!')
}
創(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文件,同時注冊上面的404錯誤處理中間件,代碼如下:
'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對象給routes層,添加的代碼如下:
// 引入路由
const routes = require('./app/routes/routes')
// 注冊路由
routes(app)
注:該代碼要添加在生成app實例的代碼之后,即const app = express()之后。
測試接口
至此,第一個接口完成,當然,這只是一個接口,沒有任何邏輯,但是也夠了,邏輯可以后面再添加。接下來,對接口做簡單測試。
首先,node server.js,啟動程序。
然后,打開postman,發(fā)送POST請求到localhost:4000/users,發(fā)現(xiàn)返回create success,看來接口是生效的。
然后再發(fā)送POST請求到localhost:4000/users1212,發(fā)現(xiàn)返回404,您訪問的路由不存在!,看來404錯誤處理中間件也是生效的。
小結(jié)
本文主要依據(jù)上一篇文章的分析,初始化了自己的項目,完成了一個沒有任何邏輯的接口(邏輯目前不重要),同時很好的完成了各層分離的目的。接下來會在此基礎(chǔ)上,使用版本控制工具git完成一個項目相對完整的git操作流程。
下面附上項目的github地址:
我的個人博客: