koa --- [MVC實現之一]自定義路由讀取規則

實現MVC分層架構

  • 目標是創建約定大于配置、開發效率高、可維護性強的項目架構
  • 路由處理
    • 規范
      • 所有路由,都要放在routes文件夾中
      • 若導出路由對象,使用 動詞+空格+路徑 作為key, 值是操作方法
      • 若導出函數, 則函數返回第二條約定格式的對象
    • 路由定義:
      • 新建 router/index.js, 默認index.js沒有前綴
      module.exports = {'get /':async ctx => {ctx.body = '首頁'},'get /detail': ctx => {ctx.body = '詳情頁面'}
      }
      
      • 新建 router/user.js路由前綴是/user
      module.exports = {
      'get /': async ctx => {ctx.body = '用戶首頁'
      },
      'get /detail': async ctx => {ctx.body = '用戶詳情頁面'
      }
      

}
````

新建目錄結構如下

在這里插入圖片描述

/mar/mar-load.js

  • load函數,根據傳入的參數(‘routes’),讀取目錄及其內容,將得到參數該回調函數
  • 說明:
  1. __dirname: 保存的是當前文件夾的路徑
  2. fs.readdirSync: 同步獲取當前文件夾下的文件
  3. require(filename): 獲取文件夾中的內容
const path = require('path');
const fs= require('fs');
const load = async (dir, cb) =>{// 獲取dir的路徑const url = path.resolve(__dirname, dir);// 獲取dir文件夾下的文件內容const files = fs.readdirSync(url);// 遍歷文件files.forEach((filename) =>{// 去掉擴展模filename = filename.replace('.js', '');const routes= require(`${url}/${filename}`);cb(filename, routes);})
}
  • initRouter函數:
  1. 使用koa-router將路由和路由處理函數關聯起來
  2. 根據load函數傳來的函數名,添加路由前綴
const Router = require('koa-router');
const initRouter = () =>{const router = new Router();load("routes", (filename, routes) =>{const prefix = filename === 'index' ? '' : '${filename}';Object.keys(routes).forEach( key =>{const [ method, path ] = key.split(' ');// 注冊路由router[method](prefix + '/' + path, routes[key]);})})return router
}
  • 總體代碼如下
  • /mar/mar-load.js
const fs = require('fs');
const path = require('path');
const Router = require('koa-router');// 讀取目錄和路徑
const load = async (dir, cb) => {// 獲取絕對路徑const url = path.resolve(__dirname, dir);// 讀取目錄const files = fs.readdirSync(url);files.forEach((filename) => {// 去掉擴展名filename = filename.replace('.js', '');const routes = require(url + '/' + filename);cb(filename, routes);})}// 加載路由
// app.get('/', ctx => {})
const initRouter = () => {const router = new Router();load('routes', (filename, 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;
}
module.exports = { initRouter }

初始化文件

  • /mar/index.js: 為初始文件,負責工作如下:
  1. 加載mar-load.js,并執行.
  2. 創建一個http服務器監聽3000端口
const koa = require('koa');
const app = new koa();
const { initRouter } = require('./mar-load');
app.use(initRouter().routes());
app.listen(3000);

啟動

node index.js
在這里插入圖片描述

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

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

相關文章

sql中的left join、right join、inner join

sql中的left join、right join、inner join 轉自:http://www.cnblogs.com/pcjim/articles/799302.html left join(左聯接) 返回包括左表中的所有記錄和右表中聯結字段相等的記錄 right join(右聯接) 返回包括右表中的所有記錄和左表中聯結字段相等的記錄inner join…

bzoj1128 Lam-lights

題目描述 對于一個長度為n的數列p,數列中任意兩個數互質。準備一個無限長的儲存器。然后從p1開始,把儲存器中p1倍數位置都賦值為p1,把儲存器中p2倍數位置都賦值為p2,把儲存器中p3倍數位置都賦值為p3。。。把儲存器中pn倍數位置都賦…

koa --- [MVC實現之二]Controller層的實現

[MVC實現之一]傳送門 https://blog.csdn.net/piano9425/article/details/103362966 Router層 router這一層,不做業務處理,僅僅只是將路由和路由的處理函數結合起來.路由的處理函數由Controller層實現改進目錄結構如下(實際上新建了controller文件夾及其內部子文件,mar.js) …

k8s install

https://xiangyu123.github.io/2018/10/17/k8s-install/轉載于:https://www.cnblogs.com/robinunix/p/9809937.html

Redis 幾種應用場景

Redis 幾種應用場景 字符串緩存 <?php$redis new Redis();$redis->connect(127.0.0.1,6379);$strKey test;$strKey1 test1;//set$arrCache [name>mysteryH,sex>男,age>22];$redis->set($strKey,json_encode($arrCache));$redis->expire($strKey,300…

HDU 6029(思維)

傳送門題面&#xff1a;Graph TheoryTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1220 Accepted Submission(s): 553Problem DescriptionLittle Q loves playing with different kinds of graphs very muc…

2018.10.18多校

T1&#xff1a;雖說大家都被cdq限制住了思維&#xff0c;我一個注意到了排列有問題的還是涼了&#xff0c;這個我沒有一點辦法了。 鏈接&#xff1a;cdq T2&#xff1a;留坑&#xff0c;太毒了 T3&#xff1a;考場上就不覺得能寫&#xff0c;雖然心里想到一些做法&#xff0c;還…

Layui --- [Mar]給渲染后的表格加CSS樣式

為什么要控制樣式 使用layui生成后的表格的樣式有時候,并不能滿足我們的需求.因此在渲染完成后,需要自定義類對其操作 Layui表格渲染后一般會出現以下結構 分結構如下 我把使用layui的table渲染后的表格分為如下的幾個dom 1.$rawTable: 初始table,即 2.$renderTable: 渲染之…

Python 楊輝三角形的簡單實現

Python 楊輝三角形的簡單實現 介紹&#xff1a; 楊輝三角 實現&#xff1a; # -*- coding: utf-8 -*-def triangles():L[1]while True:yield LL [1] [ L[i-1] L[i] for i in range(1,len(L)) ] [1]n 0 for t in triangles():print(t)n n1if n 10 :break 效果&#x…

Jackson序列化和反序列化

1&#xff0c;下載Jackson工具包(jackson-core-2.2.3.jar jackson-annotations-2.2.3.jar jackson-databind-2.2.3.jar ) jackson-core-2.2.3.jar 核心包 http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.2.3/jackson-core-2.2.3.jarjackson-annot…

Python 框架之Flask初步了解

Python 框架之Flask初步了解 前言 ? 在了解python web 框架之前&#xff0c;我們需要先了解框架實現的基本原理。首先&#xff0c;需要了解WSGI&#xff08;Web Server Gateway Interface&#xff09;&#xff0c;借助WSGI我們就能實現用Python專注于生成HTML文檔&#xff0…

AJAX異步交互

什么是AJAX AJAX&#xff08;Asynchronous Javascript And XML&#xff09;翻譯成中文就是“異步Javascript和XML”。即使用Javascript語言與服務器進行異步交互&#xff0c;傳輸的數據為XML&#xff08;當然&#xff0c;傳輸的數據不只是XML&#xff09;。 AJAX還有一個最大的…

koa --- [MVC實現之三]換個角度重新開始-初始化

說明 下面文章是對該系列前面2篇及項目中經驗的總結,重新開始寫的實現了Mar類,貫穿Router層、Controller層、Service層基本骨架的搭建 初始 使用Koa創建一個簡單的服務器,一般會使用如下 const koa require(koa); const app new koa(); const Router require(koa-router…

MySQL索引設計原則

一、MySQL常用的索引類型 1.1主鍵索引 primary key 1.2唯一索引 unique 1.3普通索引 index 1.4全文索引 1.5組合索引 二、MySQL常用的數據結構 2.1B-tree 2.2哈希索引 三、索引的設計原則 3.1選擇唯一性索引 被設為唯一性的值可以設置為索引&#xff0c;這樣能快速定位到某條記…

Flask-admin 學習及一些筆記

Flask-admin 學習及一些筆記 基本認識&#xff1a;flask-admin是flask的擴張&#xff0c;主要用于對flask應用程序增加管理界面。 some notes&#xff1a; 在 BaseView 的子類中可以定義若干個視圖函數, 使用 Flask-Admin 的 expose 裝飾器來注冊函數為視圖, 這與一般的視圖…

java web 服務器環境搭建之jdk安裝

Java 部署環境搭建 一 安裝centos系統,安裝完成后用root用戶登錄 二 Java 環境安裝 下載jdk安裝包,使用以下命令下載安裝包,也可以在windows環境現在,在上傳到linux機器上curl -O -L http://download.oracle.com/otn-pub/java/jdk/8u191-b12/2787e4a523244c269598db4e85c51e0c/…

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

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

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

教材學習內容總結 課本第七章主要圍繞windows操作系統安全攻防技術進行講述&#xff0c;教材中主要涉及的攻擊內容如下&#xff1a; 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結構…