成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

iKcamp|基于Koa2搭建Node.js實(shí)戰(zhàn)(含視頻)? 代碼分層

shusen / 2835人閱讀

視頻地址:https://www.cctalk.com/v/15114923889408

文章

在前面幾節(jié)中,我們已經(jīng)實(shí)現(xiàn)了項(xiàng)目中的幾個(gè)常見操作:?jiǎn)?dòng)服務(wù)器、路由中間件、GetPost 形式的請(qǐng)求處理等?,F(xiàn)在你已經(jīng)邁出了走向成功的第一步。

目前,整個(gè)示例中所有的代碼都寫在 app.js 中。然而在業(yè)務(wù)代碼持續(xù)增大,場(chǎng)景更加復(fù)雜的情況下,這種做法無論是對(duì)后期維護(hù)還是對(duì)患有強(qiáng)迫癥的同學(xué)來說都不是好事。所以我們現(xiàn)在要做的就是:『分梨』。

分離 router

路由部分的代碼可以分離成一個(gè)獨(dú)立的文件,并根據(jù)個(gè)人喜好放置于項(xiàng)目根目錄下,或獨(dú)立放置于 router 文件夾中。在這里,我們將它命名為 router.js并將之放置于根目錄下。

修改路由 router.js
  const router = require("koa-router")()

  module.exports = (app) => {
    router.get("/", async(ctx, next) => {
      ctx.response.body = `

index page

` }) router.get("/home", async(ctx, next) => { console.log(ctx.request.query) console.log(ctx.request.querystring) ctx.response.body = "

HOME page

" }) router.get("/home/:id/:name", async(ctx, next)=>{ console.log(ctx.params) ctx.response.body = "

HOME page /:id/:name

" }) router.get("/user", async(ctx, next)=>{ ctx.response.body = `


` }) // 增加響應(yīng)表單請(qǐng)求的路由 router.post("/user/register",async(ctx, next)=>{ let {name, password} = ctx.request.body if( name == "ikcamp" && password == "123456" ){ ctx.response.body = `Hello, ${name}!` }else{ ctx.response.body = "賬號(hào)信息錯(cuò)誤" } }) app.use(router.routes()) .use(router.allowedMethods()) }
修改 app.js
  const Koa = require("koa")
  const bodyParser = require("koa-bodyparser")
  const app = new Koa()
  const router = require("./router")

  app.use(bodyParser())

  router(app)

  app.listen(3000, () => {
    console.log("server is running at http://localhost:3000")
  })

代碼看起來清爽了很多。

然而到了這一步,還是不能夠高枕無憂。router 文件獨(dú)立出來以后,應(yīng)用的主文件 app.js 雖然暫時(shí)看起來比較清爽,但這是在只有一個(gè)路由,并且處理函數(shù)也非常簡(jiǎn)單的情況下。如果有多個(gè)路由,每個(gè)處理函數(shù)函數(shù)代碼量也都繁復(fù)可觀,這就不是主管們喜聞樂見的事情了。

接下來我們對(duì)結(jié)構(gòu)進(jìn)行進(jìn)一步優(yōu)化。

分離 controller 層
我們把路由對(duì)應(yīng)的業(yè)務(wù)邏輯也分離出來。
新增 controller/home.js

新建 controller 文件夾,增加一個(gè) home.js 文件,并從 router.js 中提取出業(yè)務(wù)邏輯代碼。

  module.exports = {
    index: async(ctx, next) => {
      ctx.response.body = `

index page

` }, home: async(ctx, next) => { console.log(ctx.request.query) console.log(ctx.request.querystring) ctx.response.body = "

HOME page

" }, homeParams: async(ctx, next) => { console.log(ctx.params) ctx.response.body = "

HOME page /:id/:name

" }, login: async(ctx, next) => { ctx.response.body = `


` }, register: async(ctx, next) => { let { name, password } = ctx.request.body if (name == "ikcamp" && password == "123456") { ctx.response.body = `Hello, ${name}!` } else { ctx.response.body = "賬號(hào)信息錯(cuò)誤" } } }
修改路由 router.js

修改 router.js 文件,在里面引入 controler/home

  const router = require("koa-router")()
  const HomeController = require("./controller/home")
  module.exports = (app) => {
    router.get( "/", HomeController.index )
    
    router.get("/home", HomeController.home)
    
    router.get("/home/:id/:name", HomeController.homeParams)
    
    router.get("/user", HomeController.login)
    
    router.post("/user/register", HomeController.register)
    
    app.use(router.routes())
      .use(router.allowedMethods())
  }

如此,將每個(gè)路由的處理邏輯分離到 controller 下的獨(dú)立文件當(dāng)中,便于后期維護(hù)。

目前的代碼結(jié)構(gòu)已經(jīng)比較清晰了,適用于以 node 作為中間層、中轉(zhuǎn)層的項(xiàng)目。如果想要把 node 作為真正的后端去操作數(shù)據(jù)庫(kù)等,建議再分出一層 service,用于處理數(shù)據(jù)層面的交互,比如調(diào)用 model 處理數(shù)據(jù)庫(kù),調(diào)用第三方接口等,而controller 里面只做一些簡(jiǎn)單的參數(shù)處理。

分離 service 層
這一層的分離,非必需,可以根據(jù)項(xiàng)目情況適當(dāng)增加,或者把所有的業(yè)務(wù)邏輯都放置于 controller 當(dāng)中。
新建 service/home.js

新建 service 文件夾,并于該文件夾下新增一個(gè) home.js 文件,用于抽離 controller/home.js 中的部分代碼:

  module.exports = {
    register: async(name, pwd) => {
      let data 
      if (name == "ikcamp" && pwd == "123456") {
        data = `Hello, ${name}!`
      } else {
        data = "賬號(hào)信息錯(cuò)誤"
      }
      return data
    }
  }
修改 controller/home.js
// 引入 service 文件
const HomeService = require("../service/home")
module.exports = {
  // ……省略上面代碼
  // 重寫 register 方法 
  register: async(ctx, next) => {
    let {
      name,
      password
    } = ctx.request.body
    let data = await HomeService.register(name, password)
    ctx.response.body = data
  }
}
重構(gòu)完成

下一節(jié)我們將引入視圖層 views,還會(huì)介紹使用第三方中間件來設(shè)置靜態(tài)資源目錄等。新增的部分前端資源代碼會(huì)讓我們的用例更加生動(dòng),盡情期待吧。

下一篇:視圖nunjucks——Koa 默認(rèn)支持的模板引擎

上一篇:iKcamp新課程推出啦~~~~~iKcamp|基于Koa2搭建Node.js實(shí)戰(zhàn)(含視頻)? HTTP請(qǐng)求
推薦: 翻譯項(xiàng)目Master的自述: 1. 干貨|人人都是翻譯項(xiàng)目的Master 2. iKcamp出品微信小程序教學(xué)共5章16小節(jié)匯總(含視頻)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/90638.html

相關(guān)文章

  • 開始連載啦~每周2更共11堂iKcamp課|基于Koa2搭建Node.js實(shí)戰(zhàn)項(xiàng)目教學(xué)(視頻)|

    摘要:玩轉(zhuǎn)同時(shí)全面掌握潮流技術(shù)采用新一代的開發(fā)框架更小更富有表現(xiàn)力更健壯。融合多種常見的需求場(chǎng)景網(wǎng)絡(luò)請(qǐng)求解析模板引擎靜態(tài)資源日志記錄錯(cuò)誤請(qǐng)求處理。結(jié)合語(yǔ)句中轉(zhuǎn)中間件控制權(quán),解決回調(diào)地獄問題。注意分支中的目錄為當(dāng)節(jié)課程后的完整代碼。 ?? ?與眾不同的學(xué)習(xí)方式,為你打開新的編程視角 獨(dú)特的『同步學(xué)習(xí)』方式 文案講解+視頻演示,文字可激發(fā)深層的思考、視頻可還原實(shí)戰(zhàn)操作過程。 云集一線大廠...

    B0B0 評(píng)論0 收藏0
  • 【完結(jié)匯總】iKcamp出品基于Koa2搭建Node.js實(shí)戰(zhàn)共十一堂課(視頻)

    摘要:云集一線大廠有真正實(shí)力的程序員團(tuán)隊(duì)云集一線大廠經(jīng)驗(yàn)豐厚的碼農(nóng),開源奉獻(xiàn)各教程。融合多種常見的需求場(chǎng)景網(wǎng)絡(luò)請(qǐng)求解析模板引擎靜態(tài)資源日志記錄錯(cuò)誤請(qǐng)求處理。結(jié)合語(yǔ)句中轉(zhuǎn)中間件控制權(quán),解決回調(diào)地獄問題。注意分支中的目錄為當(dāng)節(jié)課程后的完整代碼。 ?? ?與眾不同的學(xué)習(xí)方式,為你打開新的編程視角 獨(dú)特的『同步學(xué)習(xí)』方式 文案講解+視頻演示,文字可激發(fā)深層的思考、視頻可還原實(shí)戰(zhàn)操作過程。 云...

    sPeng 評(píng)論0 收藏0
  • iKcamp基于Koa2搭建Node.js實(shí)戰(zhàn)視頻)? HTTP請(qǐng)求

    POST/GET請(qǐng)求——常見請(qǐng)求方式處理 ?? iKcamp 制作團(tuán)隊(duì) 原創(chuàng)作者:大哼、阿干、三三、小虎、胖子、小哈、DDU、可木、晃晃 文案校對(duì):李益、大力萌、Au、DDU、小溪里、小哈 風(fēng)采主播:可木、阿干、Au、DDU、小哈 視頻剪輯:小溪里 主站運(yùn)營(yíng):給力xi、xty 教程主編:張利濤 視頻地址:https://www.cctalk.com/v/15114357765870 ...

    張利勇 評(píng)論0 收藏0
  • iKcamp基于Koa2搭建Node.js實(shí)戰(zhàn)視頻)? 視圖Nunjucks

    視頻地址:https://www.cctalk.com/v/15114923888328 showImg(https://segmentfault.com/img/remote/1460000012744407?w=1602&h=966); 視圖 Nunjucks 彩虹是上帝和人類立的約,上帝不會(huì)再用洪水滅人。 客戶端和服務(wù)端之間相互通信,傳遞的數(shù)據(jù)最終都會(huì)展示在視圖中,這時(shí)候就需要用到『模板引擎...

    whlong 評(píng)論0 收藏0
  • iKcamp基于Koa2搭建Node.js實(shí)戰(zhàn)視頻)? 解析JSON

    視頻地址:https://www.cctalk.com/v/15114923886141 showImg(https://segmentfault.com/img/remote/1460000012840997?w=1604&h=964); JSON 數(shù)據(jù) 我顛倒了整個(gè)世界,只為擺正你的倒影。 前面的文章中,我們已經(jīng)完成了項(xiàng)目中常見的問題,比如 路由請(qǐng)求、結(jié)構(gòu)分層、視圖渲染、靜態(tài)資源等。 那么,J...

    mudiyouyou 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<