實現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’),讀取目錄及其內容,將得到參數該回調函數- 說明:
__dirname
: 保存的是當前文件夾的路徑fs.readdirSync
: 同步獲取當前文件夾下的文件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
函數:
- 使用
koa-router
將路由和路由處理函數關聯起來 - 根據
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
: 為初始文件,負責工作如下:
- 加載mar-load.js,并執行.
- 創建一個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