[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层的实现相关推荐

  1. [置顶]信息发布系统 Jquery+MVC架构开发(7) Controller层

    Controller 这一层首先要添加对WCF 的引用: 如下,输入我们自己的wcf地址 http://localhost:8732/Design_Time_Addresses/InfoPub.BLL ...

  2. spring mvc 传中文 到controller层乱码的 解决方法

    String sta =null;         try {             sta = new String(status.getBytes("iso-8859-1") ...

  3. koa --- [MVC实现之五]Model层的实现

    说明 上一篇: MVC实现之四 这一篇主要介绍: 项目中用到的Sequelize库中的一些方法,参考使用Sequelize连接mysql 将Model层加入Mar类中 Service层 还是从业务出发 ...

  4. koa --- [MVC实现之四]Router、Controller、Service的实现

    说明 上一篇: [MVC实现之三] 上一篇实现了,Router层.Controller层.Service层的基本原则,并且成功的通过Mar类来传递这些层级之间需要的参数. 这一篇主要是通过业务层面来具 ...

  5. mvc 怎么把后台拼接好的div写到前台_五、controller层配置和前台数据crud操作的实现...

    这个系列专栏的完结可能比我想象要快一些.不过可能将来要完善这个项目的时候还会加以改进.我今天争取把最后一层:控制层的代码给写完.明天最后一篇博文将讲讲Session.cookie对用户登录的控制,并最 ...

  6. Controller 层实现

    一.实验介绍 1.1 实验内容 本节课程主要利用 Spring MVC 框架实现 Controller 层以及一些辅助类的实现. 1.2 实验知识点 Spring MVC 框架 1.3 实验环境 JD ...

  7. 如何优雅的写 Controller 层代码?找对姿势!

    前言 本篇主要要介绍的就是controller层的处理,一个完整的后端请求由4部分组成:1. 接口地址(也就是URL地址)2. 请求方式(一般就是get.set,当然还有put.delete)3. 请 ...

  8. 对SSM框架中Dao层,Mapper层,controller层,service层,model层,entity层等层的理解

    SSM 是 Spring + SpringMVC + Mybatis集成的框架. MVC即model view controller.(模型,视图,控制器) 一.entity层(model层,doma ...

  9. 如何优雅的写 Controller 层代码?

    本篇主要要介绍的就是controller层的处理,一个完整的后端请求由4部分组成:1. 接口地址(也就是URL地址).2. 请求方式(一般就是get.set,当然还有put.delete).3. 请求 ...

最新文章

  1. NTT高级科学家:光子是深度学习的未来!光子有望替代电子计算机加速神经网络计算...
  2. 开源代码却无奈遗弃,濒临奔溃的开源开发者们!
  3. MyBatis运行原理(三)接口式编程及创建代理对象原理分析
  4. 通过kubeless命令行部署Kyma Lambda Function
  5. python全局变量的声明和使用_Python二级(07)——函数和代码复用
  6. 利用xlrd,Python对excel读取文件
  7. 几个接下来要解决的问题
  8. 提取数据_EasyStat如何提取数据+个性化出图
  9. js面向对象插件的做法框架new goBuy('.cakeItem',{ add:'.add', reduce:'.reduce' },[1,0.7,0.6]);...
  10. 保存Google、Bing翻译的语音
  11. python的100道数学题_python经典例题100道
  12. matlab程序 直线插补,用Matlab实现直线插补计算程序
  13. 【小程序源码】花体字转换器支持多种花样字体不同风格
  14. crt计算机显示器,crt显示器最高分辨率_crt显示器最高刷新率
  15. 鸿蒙电视如何播放手机上的歌,如何用鸿蒙OS在蜂鸣器播放音乐
  16. Elasticsearch-好文推荐
  17. Java-- Maps
  18. 第四届传智杯(初赛B组) | python题解思路
  19. 数据库连接的Persist Security Info参数说明
  20. Docker网络原则入门:EXPOSE,-p,-P,-link

热门文章

  1. qt开发环境 - c++之结构,联合,枚举
  2. python中rim的用法_Python并发开发简介
  3. 换脸系列——眼鼻口替换
  4. 12bit灰度图像映射到8bit显示及python 实现
  5. 洛谷模板,树状数组二 差分
  6. [Pytorch]Pytorch的tensor变量类型转换
  7. 线程的基本协作和生产者消费者
  8. java实现Comparable接口和Comparator接口,并重写compareTo方法和compare方法
  9. 在Eclipse中添加JDK源码包
  10. Python学习 - 常用模块(二)