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

基礎(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、classasync/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地址:

項目地址

我的個人博客:

毛浩先生的個人博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容