视频地址:https://www.cctalk.com/v/15114923889408

文章

在前面几节中,我们已经实现了项目中的几个常见操作:启动服务器、路由中间件、GetPost 形式的请求处理等。现在你已经迈出了走向成功的第一步。

目前,整个示例中所有的代码都写在 app.js 中。然而在业务代码持续增大,场景更加复杂的情况下,这种做法无论是对后期维护还是对患有强迫症的同学来说都不是好事。所以我们现在要做的就是:『分梨』。

分离 router

路由部分的代码可以分离成一个独立的文件,并根据个人喜好放置于项目根目录下,或独立放置于 router 文件夹中。在这里,我们将它命名为 router.js并将之放置于根目录下。

修改路由 router.js

  1. const router = require('koa-router')()
  2. module.exports = (app) => {
  3. router.get('/', async(ctx, next) => {
  4. ctx.response.body = `<h1>index page</h1>`
  5. })
  6. router.get('/home', async(ctx, next) => {
  7. console.log(ctx.request.query)
  8. console.log(ctx.request.querystring)
  9. ctx.response.body = '<h1>HOME page</h1>'
  10. })
  11. router.get('/home/:id/:name', async(ctx, next)=>{
  12. console.log(ctx.params)
  13. ctx.response.body = '<h1>HOME page /:id/:name</h1>'
  14. })
  15. router.get('/user', async(ctx, next)=>{
  16. ctx.response.body =
  17. `
  18. <form action="/user/register" method="post">
  19. <input name="name" type="text" placeholder="请输入用户名:ikcamp"/>
  20. <br/>
  21. <input name="password" type="text" placeholder="请输入密码:123456"/>
  22. <br/>
  23. <button>GoGoGo</button>
  24. </form>
  25. `
  26. })
  27. // 增加响应表单请求的路由
  28. router.post('/user/register',async(ctx, next)=>{
  29. let {name, password} = ctx.request.body
  30. if( name == 'ikcamp' && password == '123456' ){
  31. ctx.response.body = `Hello, ${name}!`
  32. }else{
  33. ctx.response.body = '账号信息错误'
  34. }
  35. })
  36. app.use(router.routes())
  37. .use(router.allowedMethods())
  38. }

修改 app.js

  1. const Koa = require('koa')
  2. const bodyParser = require('koa-bodyparser')
  3. const app = new Koa()
  4. const router = require('./router')
  5. app.use(bodyParser())
  6. router(app)
  7. app.listen(3000, () => {
  8. console.log('server is running at http://localhost:3000')
  9. })

代码看起来清爽了很多。

然而到了这一步,还是不能够高枕无忧。router 文件独立出来以后,应用的主文件 app.js 虽然暂时看起来比较清爽,但这是在只有一个路由,并且处理函数也非常简单的情况下。如果有多个路由,每个处理函数函数代码量也都繁复可观,这就不是主管们喜闻乐见的事情了。

接下来我们对结构进行进一步优化。

分离 controller 层

我们把路由对应的业务逻辑也分离出来。

新增 controller/home.js

新建 controller 文件夹,增加一个 home.js 文件,并从 router.js 中提取出业务逻辑代码。

  1. module.exports = {
  2. index: async(ctx, next) => {
  3. ctx.response.body = `<h1>index page</h1>`
  4. },
  5. home: async(ctx, next) => {
  6. console.log(ctx.request.query)
  7. console.log(ctx.request.querystring)
  8. ctx.response.body = '<h1>HOME page</h1>'
  9. },
  10. homeParams: async(ctx, next) => {
  11. console.log(ctx.params)
  12. ctx.response.body = '<h1>HOME page /:id/:name</h1>'
  13. },
  14. login: async(ctx, next) => {
  15. ctx.response.body =
  16. `
  17. <form action="/user/register" method="post">
  18. <input name="name" type="text" placeholder="请输入用户名:ikcamp"/>
  19. <br/>
  20. <input name="password" type="text" placeholder="请输入密码:123456"/>
  21. <br/>
  22. <button>GoGoGo</button>
  23. </form>
  24. `
  25. },
  26. register: async(ctx, next) => {
  27. let {
  28. name,
  29. password
  30. } = ctx.request.body
  31. if (name == 'ikcamp' && password == '123456') {
  32. ctx.response.body = `Hello, ${name}!`
  33. } else {
  34. ctx.response.body = '账号信息错误'
  35. }
  36. }
  37. }

修改路由 router.js

修改 router.js 文件,在里面引入 controler/home

  1. const router = require('koa-router')()
  2. const HomeController = require('./controller/home')
  3. module.exports = (app) => {
  4. router.get( '/', HomeController.index )
  5. router.get('/home', HomeController.home)
  6. router.get('/home/:id/:name', HomeController.homeParams)
  7. router.get('/user', HomeController.login)
  8. router.post('/user/register', HomeController.register)
  9. app.use(router.routes())
  10. .use(router.allowedMethods())
  11. }

如此,将每个路由的处理逻辑分离到 controller 下的独立文件当中,便于后期维护。

目前的代码结构已经比较清晰了,适用于以 node 作为中间层、中转层的项目。如果想要把 node 作为真正的后端去操作数据库等,建议再分出一层 service,用于处理数据层面的交互,比如调用 model 处理数据库,调用第三方接口等,而controller 里面只做一些简单的参数处理。

分离 service 层

这一层的分离,非必需,可以根据项目情况适当增加,或者把所有的业务逻辑都放置于 controller 当中。

新建 service/home.js

新建 service 文件夹,并于该文件夹下新增一个 home.js 文件,用于抽离 controller/home.js 中的部分代码:

  1. module.exports = {
  2. register: async(name, pwd) => {
  3. let data
  4. if (name == 'ikcamp' && pwd == '123456') {
  5. data = `Hello, ${name}!`
  6. } else {
  7. data = '账号信息错误'
  8. }
  9. return data
  10. }
  11. }

修改 controller/home.js

  1. // 引入 service 文件
  2. const HomeService = require('../service/home')
  3. module.exports = {
  4. // ……省略上面代码
  5. // 重写 register 方法
  6. register: async(ctx, next) => {
  7. let {
  8. name,
  9. password
  10. } = ctx.request.body
  11. let data = await HomeService.register(name, password)
  12. ctx.response.body = data
  13. }
  14. }

重构完成

下一节我们将引入视图层 views,还会介绍使用第三方中间件来设置静态资源目录等。新增的部分前端资源代码会让我们的用例更加生动,尽情期待吧。

下一篇:视图nunjucks——Koa 默认支持的模板引擎

上一篇:iKcamp新课程推出啦~~~~~iKcamp|基于Koa2搭建Node.js实战(含视频)☞ HTTP请求

推荐: 翻译项目Master的自述:

1. 干货|人人都是翻译项目的Master

2. iKcamp出品微信小程序教学共5章16小节汇总(含视频)

iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 代码分层的更多相关文章

  1. iKcamp团队制作|基于Koa2搭建Node.js实战项目教学(含视频)☞ 环境准备

    安装搭建项目的开发环境 视频地址:https://www.cctalk.com/v/15114357764004 文章 Koa 起手 - 环境准备 由于 koa2 已经开始使用 async/await ...

  2. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 错误处理

    沪江CCtalk视频地址:https://www.cctalk.com/v/15114923887518 处理错误请求 爱能遮掩一切过错. 当我们在访问一个站点的时候,如果访问的地址不存在(404), ...

  3. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 记录日志

    沪江CCtalk视频地址:https://www.cctalk.com/v/15114923883523 log 日志中间件 最困难的事情就是认识自己. 在一个真实的项目中,开发只是整个投入的一小部分 ...

  4. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 解析JSON

    视频地址:https://www.cctalk.com/v/15114923886141 JSON 数据 我颠倒了整个世界,只为摆正你的倒影. 前面的文章中,我们已经完成了项目中常见的问题,比如 路由 ...

  5. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 处理静态资源

    视频地址:https://www.cctalk.com/v/15114923882788 处理静态资源 无非花开花落,静静. 指定静态资源目录 这里我们使用第三方中间件: koa-static 安装并 ...

  6. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 视图Nunjucks

    视频地址:https://www.cctalk.com/v/15114923888328 视图 Nunjucks 彩虹是上帝和人类立的约,上帝不会再用洪水灭人. 客户端和服务端之间相互通信,传递的数据 ...

  7. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 规范与部署

    沪江CCtalk视频地址:https://www.cctalk.com/v/15114923889450 规范与部署 懒人推动社会进步. 本篇中,我们会讲述三个知识点 定制书写规范 开发环境运行 如何 ...

  8. iKcamp团队制作|基于Koa2搭建Node.js实战(含视频)☞ 中间件用法

    中间件用法--讲解 Koa2 中间件的用法及如何开发中间件

  9. iKcamp团队制作|基于Koa2搭建Node.js实战(含视频)☞ 路由koa-router

    路由koa-router--MVC 中重要的环节:Url 处理器

随机推荐

  1. vue-cli、webpack提取第三方库-----DllPlugin、DllReferencePlugin

    需要安装的插件有 extract-text-webpack-plugin assets-webpack-plugin clean-webpack-plugin npm install extract- ...

  2. linux 知识点

    关于登录Linux时,/etc/profile.~/.bash_profile等几个文件的执行过程. 在登录Linux时要执行文件的过程如下: 在刚登录Linux时,首先启动 /etc/profile ...

  3. php设计模式:单例模式

    前些日子开始着真正的去了解下设计模式,开始么,简单地从单例模式开始,当然网上看了一些资料,单例模式比较好理解,看看介绍,然后看看代码基本也就能够理解了,设计模式这些的花点心思基本的是能够理解的,当然要 ...

  4. Linux 下V4l2摄像头采集图片,实现yuyv转RGB,RGB转BMP,RGB伸缩,jpeglib 库实现压缩RGB到内存中,JPEG经UDP发送功(转)

    ./configure CC=arm-linux-gnueabihf-gcc LD=arm-linux-gnueabihf-ld --host=arm-linux --prefix=/usr/loca ...

  5. bzoj 4137 [FJOI2015]火星商店问题——线段树分治+可持久化01trie树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4137 关于可持久化01trie树:https://www.cnblogs.com/LadyL ...

  6. POJ2777(线段树裸题)

    题目:http://poj.org/problem?id=2777 别忘了各地的return: 有可能输入的L<R,手动swap: 似乎是多组输入? pushup和pushdown的位置. (原 ...

  7. bzoj1066 蜥蜴

    Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平 ...

  8. DNS 解释 --- 解析域名给电脑,电脑只看得懂1.1.1.1.1 这些ip地址 所以要翻译给他

    把域名翻译成IP地址的软件称为域名系统,即DNS 当网络上的一台客户机需要访问某服务器上的资源时,客户机的用户只需要在浏览器中的地址文本框中输入该服务器的网址.就可以与该服务器进行连接,计算机的硬件只 ...

  9. Python 天气预报+微信

    """ Description: 需要提供以下三个信息,在申请到的微信企业号当中可以找到 agentid corpid corpsecret Author:Nod Dat ...

  10. 用PNG作为Texture创建Material

    转自:http://aigo.iteye.com/blog/2279512 1,导入一张png素材作为Texture 2,新建一个Material,设置Blend Mode为Translucent,连 ...