日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

koa --- [MVC实现之二]Controller层的实现

發布時間:2023/12/10 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 koa --- [MVC实现之二]Controller层的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

[MVC實現之一]傳送門

https://blog.csdn.net/piano9425/article/details/103362966

Router層

  • router這一層,不做業務處理,僅僅只是將路由和路由的處理函數結合起來.
  • 路由的處理函數由Controller層實現
  • 改進目錄結構如下(實際上新建了controller文件夾及其內部子文件,mar.js)

Router層的改變

  • 我們希望routes下的index.js結構如下
    "get /": indexHandler;
    "get /detail: detailHandler"
  • 改成如下:
module.exports = app => ({'get /': app.controller.home.index,'get /detail': app.controller.home.detail })

注:
1.此時導出的是一個函數,而不是一個對象
2.現在已經有了路由,以及路由的處理函數的名稱.
3.路由的邏輯將在Controller層內完成

Controller實現路由邏輯

  • /mar/controller/home.js
module.exports = ctx => {index: async ctx =>{ctx.body = 'Controller Index'},detail: async ctx =>{ctx.body = 'Controller detail'} }

注:
1.實現的邏輯很簡單:根據請求的URL返回內容給瀏覽器渲染
2.現在有了,路由,路由的處理函數,路由與路由處理函數的對應.
3.下面只需將controller文件夾下的函數掛載到app上即可.
4.app是函數的實例

構造mar類

思路:
1.希望通過如下方式啟動

// mar/index.js const mar = require('./mar'); const app = mar(); app.start(3000);

2.mar類需要實現以下幾點

  • 將koa的方法掛載到實例的$app屬性上:this.$app = new koa()
  • 將controller掛載到實例的controller上:this.controller = initController()
  • 將Router掛載到實例的router上:this.router = Router()
  • 返回一個啟動函數start
// mar/mar.js const koa = require('koa'); const { initController, initRouter } = require('./mar-load');class mar {constructor(conf) {this.$app = new koa(conf);this.controller = initController();this.router = initRouter();this.$app.use(this.router.routes());}start(port) {this.$app.listen(port, `[mar]Server is running at http://localhost:${port}`);} }


此時,需要在 mar-load中定義initController,功能如下:
1.調用load函數,讀取controller下的文件
2.對應讀取出來的文件的鍵和值

const initController = () =>{const controllers = {};load('controller', (filename, controller) =>{controllers[filename] = controller;})return controoler = {}; }

  • 此時,只能監聽 user 目錄下的路由.
  • 使用console.log大法,在initRouter里面,將load('router')的結果打印出來

    發現原因:
    1./mar/routes/index.js導出的是一個函數,而/mar/routes/user.js導出的是一個對象
    2.故后面Object.keys()方法是無法遍歷’index.js’中的路由的
    3.需要改進initRouter方法如下
const initRouter = (app) => {const router = new Router();load('routes', (filename, routes) =>{routes = typeof routes === 'function' ? routes.app : routes;const prefix = filename === 'index' ? '' : `/${filename}`;Object.keys(routes).forEach(key =>{const [method, path] = key.split(' ');console.log(`正在映射地址: ${method.toLocaleUpperCase()}${prefix}${path}`);// 注冊路由router[method](prefix + path, routes[key]);})})return router; }

注:
1.此時在/mar/mar.js的構造函數中,應該將當前的this傳入,即 ‘this.router = initRouter(this)’;
2.this代表的是使用new mar()生成的實例

至此,Controller層就實現了

總結

以上是生活随笔為你收集整理的koa --- [MVC实现之二]Controller层的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。