koa --- [MVC實現之四]Router、Controller、Service的實現

說明

  • 上一篇: [MVC實現之三]
  • 上一篇實現了,Router層、Controller層、Service層的基本原則,并且成功的通過Mar類來傳遞這些層級之間需要的參數.
  • 這一篇主要是通過業務層面來具體實現:
    • Router層:監聽頁面的路由,并調用Controller層的路由處理函數
    • Controller層:給Router層提供服務,調用Service層提供的數據處理.

開始

打開瀏覽器訪問: localhost:3000
在這里插入圖片描述

  • 此時并沒有,路由處理函數.
  • 栗子: 返回一條數據

Router層

  • 思路:
    1.在該層調用koa-router
    2.建立路由和路由處理函數的聯系
    3.掛載路由
    4.定義規則:將this.koa = new koa(conf)改為this.$app = new koa(conf),使參數更具有語義(是一個koa的實例).
const koa = require('koa');
const koaRouter = require('koa-router');
class Mar {constructor(conf) {this.$app = new koa(conf);this.$router = new koaRouter();this.service = new Service(this);this.controller = new Controller(this);this.router = new Router(this);}
}class Router {constructor(app) {const { controller, $router, $app } = app;$router.get('/', controller.index);$app.use($router.routes());}
}
  • 此時,Router層,成功的利用koa-router創建并掛載路由
  • 下面只需在Controller類中寫入index方法.
  • koa-router,在監聽路由的時候,會傳入一個ctx和next對象

Controller層

  • 在此層寫入一個index方法,并使用ctx返回一個對象
class Controller {constructor() {const { service } = app;console.log('service:', service.test());this.service = service;}async index (ctx) {ctx.body = {name: 'marron',age: 18,remarks:`forever 18`}}
}

此時http://localhost:3000會返回如下信息:
在這里插入圖片描述

  • 調用Service層的異步方法
async index (ctx) {ctx.body = await service.getName();
}

在這里插入圖片描述
在這里插入圖片描述

  • 重新刷新http://localhost:3000 會報錯,原因是service沒有定義
  • 仔細讀函數會發現:
  1. 我們僅僅只是在constructor函數中使用了this.service = service
  2. this.service = service實際上只是把方法掛載到(Controller)實例上.
  3. 如何在類Controller的方法中使用Service層提供的方法呢?
    -3.1 在JavaScript中實際上是沒有類的概念,類只不過是一個語法糖
    -3.2 看以下代碼
class Point {constructor() {...},getX() {...},getY() {...}
}
// 等同于
Point.prototype = {constructor() {},getX() {},getY() {}
}

得益于以上,產生靈感如下:

  1. 在Controller層初始化的時候,將Service方法掛載到Controller的原型上
  2. 在內部方法使用時,先從原型上把需要的方法取出來

改進Router層

class Controller {constructor(app) {const { service } = app;console.log('service: ', service.test());// 將service掛載Controller的原型上Controller.prototype = service;}test() {return `Controller for Router`}async index(ctx) {const service = Controller.prototype.servicectx.body = await service.index();}
}

到這里,基本滿足了設計初衷:

  1. 通過Mar傳遞各層所需的參數
  2. 通過Router層監聽路由,并把路由對應到Controller層的方法
  3. Controller層調用Service層的方法

Service層

  • 添加index層方法
class Service {constructor(app) {console.log('Service: ok');}test() {return `Service for Controller`}async index() {return {name: 'marron',age: 18,remarks: `forever 18`}}
}

總結

  • 這一篇實現了Router、Controller、Service層內的具體通信
  • 下一篇將會加入Model層.并對此系列進行總結

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250445.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250445.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250445.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2017-2018-2 20179317 《網絡攻防技術》第七周學習心得體會

教材學習內容總結 課本第七章主要圍繞windows操作系統安全攻防技術進行講述,教材中主要涉及的攻擊內容如下: Windows操作系統的基本結構 運行于處理器特權模式的操作系統內核運行在處理器非特權模式的用戶空間代碼采用宏內核模式來進行構架 Windows操作系…

Jinja的基礎知識

Jinja的基礎知識 介紹&#xff1a;Jinja2 是一個現代的&#xff0c;設計者友好的&#xff0c;仿照 Django 模板的 Python 模板語言。 它速度快&#xff0c;被廣泛使用&#xff0c;并且提供了可選的沙箱模板執行環境保證安全 基本操作 變量&#xff1a;使用{{}}包圍 <a>…

PE文件格式詳解(二)

0x00 前言 上一篇講到了PE文件頭的中IMAGE_FILE_HEADER結構的第二個結構&#xff0c;今天從IMAGE_FILE_HEADER中第三個結構sizeOfOptionalHeader講起。這個字段的結構名也叫做IMAGE_OPTIONAL_HEDAER講起。 0x01 IMAGE_OPTIONAL_HEADER概述 其實這個結構是IMAGE_FILE_HEADER結構…

javascript --- [代碼優化]將復雜的函數分解寫異步請求數據的同步寫法

說明 今天優化項目結構,發現有如下一個函數 const drawMqiPie async (index) > {// 請求的參數let params {lineNo: lineNo,direct: 1,driveway: 1,pageNum: 0,pageSize: 0,computeRange: 3,detectDate: $(#detectYear).val() -01-01}// 請求的urllet url conf.URL s…

20165223《Java程序設計》第八周Java學習總結

教材學習內容總結 第12章-JAVA多線程機制 要點 Java中的線程Thread類與線程的創建線程的常用方法線程同步協調同步的線程線程聯合GUI線程計時器線程教材學習中的問題和解決過程 1. 進程與線程 程序&#xff1a;靜態的代碼&#xff0c;應用執行的藍本進程&#xff1a;程序的一次…

各種平臺的表達芯片跟mRNA-seq數據比較

各種平臺的表達芯片跟mRNA-seq數據比較 RNA-Seq 表達譜 芯片數據分析文章見&#xff1a;http://journals.plos.org/plosone ... ournal.pone.0078644指定的細胞系是&#xff1a;Human CCR6 CD4 memory T cell &#xff0c;測了6個時間點&#xff0c;共12個樣本表達芯片用的…

SQLAlchemy 一些基本操作

SQLAlchemy 一些基本操作 建表&#xff1a;db.create_all() 一次性創建全部的表 插入數據&#xff1a; ? 1、創建變量user User(username “hjj2”,password “1234”) ? 2、使用db.session.add(user)&#xff0c;添加到會話對象中 ? 3、使用db.session.commit()&am…

koa --- [MVC實現之五]Model層的實現

說明 上一篇: MVC實現之四這一篇主要介紹: 項目中用到的Sequelize庫中的一些方法,參考使用Sequelize連接mysql將Model層加入Mar類中 Service層 還是從業務出發,Service層是調用方,調用方式和Controller層調用Service層一樣 class Service {constructor(app) {const { model…

關于字符串 --java

這是在杭電上做一道水題時發現的&#xff0c;挺不錯&#xff0c;寫下了分享一下 http://acm.hdu.edu.cn/showproblem.php?pid2072 這里我用了兩種方法&#xff0c;參考大佬的&#xff0c;一個是list實現類&#xff0c;一個是用set框架 import java.util.*;public class Main {…

三元表達式 列表遞推 生成器表達式

#!/use/bin/python# -*- conding:utf-8 -*-# def my_max(x,y):# if x > y : #>必須緊湊# return x# else:# return y# x 10# y 20# res x if x>y else y# print(res)# name input(>>>:).strip()# res 漂亮小姐姐 if name 汪妍…

node --- 模擬事件的異步

事件 在前端瀏覽器最常見的就是頁面交互事件本質是發布/訂閱設計模式 目標 對象使用add方法訂閱事件。使用emit發布消息 訂閱事件 添加觸發事件的一個唯一字符串,以及對應的處理函數先初始化事件對象 class Event {constructor(){this.events {};} }訂閱在訂閱事件的時候,…

Vue-webpack項目配置詳解

Vue-webpack項目配置詳解 1、首先我們在構建vue項目后&#xff0c;就得先了解vue的項目結構 ├── build --------------------------------- webpack相關配置文件 │ ├── build.js --------------------------webpack打包配置文件 │ ├── check-versions.js ----…

淺談PHP面向對象編程(九)

9.0 設計模式 在編寫程序時經常會遇到一此典型的問題或需要完成某種特定需求&#xff0c;設計模式就是針對這些問題和需求&#xff0c;在大量的實踐中總結和理論化之后優選的代碼結構編程風格&#xff0c;以及解決問題的思考方式。 設計模式就像是經典的棋譜。不同的棋局&#…

javascript --- Object.create的閱讀

說明 今天閱讀koa源碼時,遇到Object.create,感覺對這個概念有點生疏,于是打開了MDN進行重新梳理傳送門 Object.create() 直接套用官網的栗子 const person {isHuman: false,printIntroduction: function () {console.log(My name is ${this.name}. Am I human? ${this.i…

python 12306 車次數據獲取

python 12306 車次數據獲取 ssl._create_default_https_context ssl._create_default_https_context train_data 2018-10-20 headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36,…

Annotation 注解

Annotation分為兩種&#xff0c;第一種為系統內置注解&#xff0c;第二種為自定義注解。系統內置注解&#xff1a;例如Override,Dprecated自定義注解&#xff1a;定義格式為 【public】 interface Annotation名稱{數據類型 變量名稱();}其中數據類型和變量自定義&#xff0c;不…

node --- [node接口閱讀]cluster的使用

目標 在主進程中完成以下事情: 每隔1秒鐘輸出,當前請求的數量創建等同于CPU數量的進程對每個進程施加一個處理函數,用于統計請求的數量 在各個CPU的進程中完成以下事情 監聽8000端口的請求,并返回最簡單的信息發送事件,以觸發主進程中施加的事件處理函數 前置知識 process…

洛谷P4777 【模板】擴展中國剩余定理(EXCRT)

傳送門 關于excrt 1 //minamoto2 #include<iostream>3 #include<cstdio>4 #define int long long5 using namespace std;6 #define getc() (p1p2&&(p2(p1buf)fread(buf,1,1<<21,stdin),p1p2)?EOF:*p1)7 char buf[1<<21],*p1buf,*p2buf;8 int …

adb shell dumpsys

獲取某個包的信息: adb shell dumpsys package <PACKAGE_NAME> 包含了Activity、Service和Receiver中的Action信息。注冊的Provider Permission信息&#xff0c;被授予的權限信息 查看AndroidManifest.xml&#xff1a; aapt dump xmltree xxx.apk AndroidManifest.xml a…

docker --- 梳理 Dockerfile docker-compose.yml

docker run -p 80:80 -v $PWD/www:/usr/share/nginx/html nginx 參數說明: 1.docker run nginx: 感覺鏡像(images)生成本地的容器 2.-p 80:80: 容器的80端口和本地的80端口的映射 3.-v:將本地的,當前文件夾下的www文件夾映射容器路徑為/usr/share/nginx/html的文件夾下 [注:]…