Koa從零搭建到Api實(shí)現(xiàn)項(xiàng)目的搭建方法
什么是Koa?
Koa 是一個(gè)新的 web 框架,由 Express 幕后的原班人馬打造, 致力于成為 web 應(yīng)用和 API 開發(fā)領(lǐng)域中的一個(gè)更小、更富有表現(xiàn)力、更健壯的基石。 通過利用 async 函數(shù),Koa 幫你丟棄回調(diào)函數(shù),并有力地增強(qiáng)錯(cuò)誤處理。 Koa 并沒有捆綁任何中間件, 而是提供了一套優(yōu)雅的方法,幫助您快速而愉快地編寫服務(wù)端應(yīng)用程序。
Koa vs Express
Koa使用promises和async函數(shù)來擺脫回調(diào)地獄的應(yīng)用并簡化錯(cuò)誤處理。它暴露自己ctx.request和ctx.response對(duì)象而不是節(jié)點(diǎn)req和res對(duì)象。另一方面,Express 使用其他屬性和方法擴(kuò)充節(jié)點(diǎn)req和res對(duì)象,并包括許多其他“框架”功能,例如路由和模板,Koa沒有。
因此,如果你希望更接近node.js和傳統(tǒng)的node.js樣式編碼,你可能希望堅(jiān)持使用Connect / Express或類似的框架。如果你想擺脫回調(diào),請(qǐng)使用Koa。
總結(jié)
Koa是一個(gè)比Express更精簡,使用node新特性的中間件框架,相比之前express就是一個(gè)龐大的框架
- 如果你喜歡diy,很潮,可以考慮Koa,它有足夠的擴(kuò)展和中間件,而且自己寫很簡單
- 如果你想簡單點(diǎn),找一個(gè)框架啥都有,那么先Express
如果你有興趣了解更多不同,請(qǐng)?jiān)L問Koa vs Express
Koa 項(xiàng)目搭建
注意,本篇教程面向有一定Koa使用經(jīng)驗(yàn)的用戶。如果,你還不了解Koa,請(qǐng)先看下面的文檔Koa 中文文檔
Koa 文檔過于精簡,雖然將每一個(gè)API都進(jìn)行解釋說明,但還是很難將其組織起來進(jìn)行應(yīng)用,對(duì)于初學(xué)者來說可謂是很不友好。
筆者第一個(gè)Koa項(xiàng)目,將所有接口,邏輯,配置等全部寫在了app.js中,雖說完美運(yùn)行,但是可讀性,可維護(hù)性極差,所以一個(gè)好的目錄結(jié)構(gòu)尤為重要
目錄創(chuàng)建
- config - 配置
- models - 數(shù)據(jù)庫模型(ROM)
- controller - 控制器
- middlewares - 中間件
- public - 靜態(tài)資源
- service - 服務(wù)
- router - 路由
- app.js - 啟動(dòng)文件
依賴安裝
創(chuàng)建好項(xiàng)目目錄后我們需要安裝一些依賴,來供我們使用
- babel-core/babel-preset-es2015 - 讓 nodeJs 支持 es6 modules
- koa - koa2
- koa-body - request body 解析
- koa-cache-control - 緩存控制
- koa-compress - gzip
- koa-cors - 跨域
- koa-logger - 日志
- koa-onerror - 錯(cuò)誤處理
- koa-router - 路由
- koa-session - session
- koa-static - 靜態(tài)資源服務(wù)
- koa-helmet - 安全
- md5 - md5 加密
- mkdirp - 遞歸創(chuàng)建目錄
可以根據(jù)自己的需求進(jìn)行選擇,但是一些依賴是必須安裝的
- koa - koa2
- koa-body - request body 解析
- koa-router - 路由
后面的內(nèi)容會(huì)講解每個(gè)插件有什么用,如何去用。
目錄詳解
config
config是我們的配置文件,比如:
- 數(shù)據(jù)庫(mysql,oracle,redis等)
- OSS
- ...
實(shí)際運(yùn)用:
- confirg
- database.config.js(新建)
database.config.js
export default { database: '', username: '', password: '', dialect: '', host: '', port: 3306 }
具體配置之后會(huì)跟大家仔細(xì)講解。
models
models文件夾主要是我們的數(shù)據(jù)庫模型(ORM),存儲(chǔ)數(shù)據(jù)庫映射文件,eg:
- models
- index.js - 入口文件
- user.js - 對(duì)應(yīng)數(shù)據(jù)庫中的user表
index.js
import Sequelize from 'sequelize' import config from '../config/database.config' const sequelize = new Sequelize(config) export const user = sequelize.import(__dirname + '/user') export default { user, sequelize }
以下序號(hào)代表代碼行號(hào):
- 引入sequelize,它是一個(gè)ORM框架,之后會(huì)詳細(xì)講解它的使用
- 引入我們之前在config中創(chuàng)建的數(shù)據(jù)庫配置文件呢
- 使用sequelize連接數(shù)據(jù)庫
- 將本地?cái)?shù)據(jù)庫映射文件導(dǎo)出供我們使用
controller
controller為控制層,主要處理外部請(qǐng)求。調(diào)用service層,將service返回的內(nèi)容整合后返回給調(diào)用方
舉例:
const user = require('../service/user') const findAllUser = async (ctx) => { const data = ctx.request.body const result = await user.findAllUser(data) ctx.body = send({data: result}) } module.exports = { findAllUser }
以下序號(hào)代表代碼行號(hào):
- 獲取請(qǐng)求體
- 調(diào)用service層
- 將service返回的內(nèi)容返回給調(diào)用者(send是自定義的數(shù)據(jù)格式化方法)
service
service作為服務(wù)層主要做相信的業(yè)務(wù)邏輯處理,數(shù)據(jù)處理等,將結(jié)果返回給controller層
舉例:
const db = require('../models/') const findAllUser = async () => { const result = await db.user.findAll() return result } module.exports = { findAllUser }
以下序號(hào)代表代碼行號(hào):
- 獲取數(shù)據(jù)庫映射文件,因?yàn)橐僮鲾?shù)據(jù)庫
- 從數(shù)據(jù)庫中查尋全部用戶(db.user.findAll()為sequelize中提供的查詢方法)
- 返回給controller
routers
router管理我們的路由,也就是接口地址
舉例:
const user = require('../controller/user') const koa_router = require('koa-router'); const router = koa_router(); router.post('/findAll', user.findAllUser) module.exports = router
以下序號(hào)代表代碼行號(hào):
- 引入controller層
- 定義接口類型,地址,調(diào)用方法(post, '/findAll'',findAllUser)
app.js
app.js是我們的入口文件及主文件,我們將router里配置的路由在此引入
const koaBody = require('koa-body') Koa = require('koa'), Router = require('koa-router') router = new Router() const user = require('./routers/user'); router.use("/user",user.routes());
這樣我們就可以訪問:ip:port/user/findAll 接口。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
node版本太高導(dǎo)致項(xiàng)目跑不起來的解決辦法(windows)
換了臺(tái)電腦后,安裝node,一切完美,發(fā)現(xiàn)其中有一個(gè)uniapp的小程序項(xiàng)目跑不起來,感覺是node版本太高導(dǎo)致的,所以只能重新安裝低版本的node,本文給大家介紹了node版本太高的解決辦法,需要的朋友可以參考下2023-10-10node異步方法的異步調(diào)用與同步調(diào)用實(shí)現(xiàn)方法示例
這篇文章主要介紹了node異步方法的異步調(diào)用與同步調(diào)用實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了node.js異步操作類的封裝以及同步、異步兩種調(diào)用方式,需要的朋友可以參考下2023-05-05PostgreSQL Node.js實(shí)現(xiàn)函數(shù)計(jì)算方法示例
這篇文章主要給大家介紹了關(guān)于PostgreSQL Node.js實(shí)現(xiàn)函數(shù)計(jì)算的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02淺析node連接數(shù)據(jù)庫(express+mysql)
Node是一個(gè)Javascript運(yùn)行環(huán)境(runtime)。實(shí)際上它是對(duì)Google V8引擎進(jìn)行了封裝。V8引 擎執(zhí)行Javascript的速度非???,性能非常好。Node對(duì)一些特殊用例進(jìn)行了優(yōu)化,提供了替代的API,使得V8在非瀏覽器環(huán)境下運(yùn)行得更好2015-11-11node.js文件上傳重命名以及移動(dòng)位置的示例代碼
本篇文章主要介紹了node.js文件上傳重命名以及移動(dòng)位置的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01Node.js從字符串生成文件流的實(shí)現(xiàn)方法
這篇文章主要介紹了Node.js從字符串生成文件流的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Node.js中Request模塊處理HTTP協(xié)議請(qǐng)求的基本使用教程
這篇文章主要介紹了Node.js中Request模塊處理HTTP請(qǐng)求的基本使用教程,request也支持OAuth的簽名請(qǐng)求,很好很強(qiáng)大,需要的朋友可以參考下2016-03-03