從零搭建項目(9) --- 后端: 項目初始化和使用Koa相關(guān)

我的博客地址

正式地址
測試地址
前端源碼
后端源碼

文章目錄

  1. 項目及其技術(shù)棧介紹
  2. 前端: 項目初始化
  3. 前端: 使用Sass和Antd
  4. 前端: 開發(fā)體驗優(yōu)化
  5. 前端: 搭建路由和狀態(tài)管理
  6. 前端: 支持Axios
  7. 前端: 打包與環(huán)境變量設(shè)置
  8. 前端: 團隊代碼規(guī)范
  9. 后端: 項目初始化和使用Koa相關(guān)
  10. 后端: 使用TypeORM和MySQL
  11. 部署: 使用nginx部署前端項目
  12. 部署: 后端部署
  13. 部署: 使用jenkins自動化部署

前言

相對于前端而言,后端搭建相對比較"輕",使用的技術(shù)棧是Koa,koa-router ,koa-bodyparser,TypeORM,數(shù)據(jù)庫使用的是MySQL,另外全部代碼都將使用TypeScript進行編寫,內(nèi)容如下:

  1. 項目啟動
  2. 編寫測試接口和路由
  3. 使用koa-bodyparser獲取請求參數(shù)

項目啟動

  • 安裝koa
    在本項目中使用的是Koa2,要安裝它,我們首先需要進行項目初始化,我新建了一個文件夾來做這件事,所以首先我們需要使用npm初始化這個文件夾: 'npm init -y',然后使用npm i -S koa安裝Koa,另外記得安裝它的類型包: npm i -D @types/koa。

  • 初始化TypeScript
    另外我們需要初始化TypeScript配置,首先安裝npm i -D typescript,然后使用tsc --init初始化一個tsconfig.json文件出來,此時我們的項目結(jié)構(gòu)如下:

    image.png

    注意,tsconfig文件中的module項需要為commonjs:
    image.png

    原因是在node中采用CommonJS 模塊規(guī)范,而我們使用TypeScript之后,將會使用es6的import進行模塊的導(dǎo)入導(dǎo)出,而typescript文件最終編譯回javascript文件的時候,需要將這部分代碼轉(zhuǎn)換成CommonJS規(guī)范,否則項目出錯。

  • 編寫啟動文件
    上面兩步都做完后,我們在根目錄中新建文件夾src,并且在里面新建index.ts文件:

    image.png

    index.ts文件中,導(dǎo)入koa,并隨便編寫一個方法,如下代碼意思就是去到localhost: 3001的時候,將會展示一個hi, i am oxc的字段:
    image.png

  • 使用nodemon啟動項目
    在上述步驟做完后,我們需要通過入口文件index.ts啟動項目,這時候使用nodemon這款工具來啟動是最好的,它擁有自動監(jiān)聽文件變化的功能。
    我們最好在全局安裝它npm i -g nodemon。
    安裝完畢后去到package.json中新建一條命令:

    image.png

    之后在命令行中使用命令npm run dev即可:
    image.png

    去到localhost: 3001查看結(jié)果,有以下字段則表明項目初始化成功:
    image.png

寫一個測試接口

在前后端分離的項目中,后端通常扮演數(shù)據(jù)的提供者,通過各種不同的接口向前端提供數(shù)據(jù),該章節(jié)基于上面項目啟動成功的情況下,將會介紹如何在koa中寫接口并向前端提供數(shù)據(jù)。

  • 編寫接口邏輯
    我們先到src文件夾下新建controller文件夾,這個文件夾是用于存放各種業(yè)務(wù)邏輯函數(shù)的,也就是MVC架構(gòu)中的C。
    然后在controller下新建test.ts文件:

    image.png

    現(xiàn)在去到test.ts中寫一個接口邏輯,這個接口在收到請求的時候,將會返回一個你好的字段:
    image.png

    另外注意導(dǎo)出的是這個類的實例,而不是這個類。

  • 編寫路由
    在koa中,通常使用koa-router作為路由處理工具,所以在編寫路由之前先安裝它:
    npm i -S koa-router
    npm i -D @types/koa-router
    然后在src文件夾下新建routers/index.ts文件,用作存放路由文件:

    image.png

    index.ts中,我們編寫一個路徑為/api/test的路由,文件中的RouteItem是路由對象的類型:
    image.png

    然后在src/index.ts中引入路由數(shù)組,并配置koa-router:
    image.png

    完成后可以測試一下接口是否跑通了。

  • 測試結(jié)果
    之后我們?nèi)サ街按罱ê玫那岸四0逯?,?code>src/services/api.ts中新增這個接口,由于baseURL中已經(jīng)存在api字段,所以前端的接口都不需要寫api字段:

    image.png

    image.png

    然后我們?nèi)サ?code>PageA組件中,引入這個接口并使用:
    image.png

    測試結(jié)果報錯了,因為端口不同的緣故導(dǎo)致跨域:
    image.png

  • 使用koa2-cors解決跨域
    解決跨域的方法有很多,在這里我們使用koa2-cors這個中間件解決跨域問題。
    首先安裝它:
    npm i -S koa2-cors
    npm i -D @types/koa2-cors
    然后直接在src/index.ts中導(dǎo)入并使用即可,注意這個中間件函數(shù)是通過執(zhí)行cors的得來的:

    image.png

    再來測試一下結(jié)果,可以得到數(shù)據(jù)了:
    image.png

    這樣我們的測試接口就完成了。

使用koa-bodyparser獲取請求參數(shù)

在上面的測試接口中,如果我們在前端傳遞參數(shù)給后端,因為是get方法,所以可以在ctx.query中獲取到:

image.png

image.png

但是如果我們它改為post方法的接口:
image.png

image.png

因為koa2沒有封裝獲取參數(shù)的方法,需要通過解析上下文context中的原生node.js請求對象req,將POST表單數(shù)據(jù)解析成query string(例如:a=1&b=2&c=3),再將query string 解析成JSON格式(例如:{"a":"1", "b":"2", "c":"3"})。但是自己來做這個事情是非常不方便的,所以需要使用到koa-bodyparser這個庫,這個庫也是一個中間件,可以將上面那樣的參數(shù)轉(zhuǎn)化為JSON格式。

  • 安裝
    npm i -S koa-bodyparser
    npm i -D @types/koa-bodyparser

  • 使用
    我們?nèi)サ?code>src/index.ts中引入它,然后通過use方法注入這個中間件:

    image.png

    然后你會發(fā)現(xiàn)ctx.request對象中多出了一個body屬性,這個屬性就是前端傳過來的參數(shù),我們將它打印出來:
    image.png

    這樣就能獲取到post請求的參數(shù)了。

后記

到這里為止,我們的koa項目就搭建起來了,獲取請求以及回應(yīng)請求都可以做到,那么下一步將通過一個注冊登錄的簡單功能來擴展接口并引入數(shù)據(jù)庫和TypeORM。

?著作權(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)容