博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 代码分层
阅读量:4684 次
发布时间:2019-06-09

本文共 4303 字,大约阅读时间需要 14 分钟。

视频地址:

160ba1db1d86e5dd?w=1604&h=964&f=png&s=869114

文章

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

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

分离 router

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

修改路由 router.js

const router = require('koa-router')()  module.exports = (app) => {    router.get('/', async(ctx, next) => {      ctx.response.body = `

index page

` }) router.get('/home', async(ctx, next) => { console.log(ctx.request.query) console.log(ctx.request.querystring) ctx.response.body = '

HOME page

' }) router.get('/home/:id/:name', async(ctx, next)=>{ console.log(ctx.params) ctx.response.body = '

HOME page /:id/:name

' }) router.get('/user', async(ctx, next)=>{ ctx.response.body = `
` }) // 增加响应表单请求的路由 router.post('/user/register',async(ctx, next)=>{ let {name, password} = ctx.request.body if( name == 'ikcamp' && password == '123456' ){ ctx.response.body = `Hello, ${name}!` }else{ ctx.response.body = '账号信息错误' } }) app.use(router.routes()) .use(router.allowedMethods()) }

修改 app.js

const Koa = require('koa')  const bodyParser = require('koa-bodyparser')  const app = new Koa()  const router = require('./router')  app.use(bodyParser())  router(app)  app.listen(3000, () => {    console.log('server is running at http://localhost:3000')  })

代码看起来清爽了很多。

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

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

分离 controller 层

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

新增 controller/home.js

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

module.exports = {    index: async(ctx, next) => {      ctx.response.body = `

index page

` }, home: async(ctx, next) => { console.log(ctx.request.query) console.log(ctx.request.querystring) ctx.response.body = '

HOME page

' }, homeParams: async(ctx, next) => { console.log(ctx.params) ctx.response.body = '

HOME page /:id/:name

' }, login: async(ctx, next) => { ctx.response.body = `
` }, register: async(ctx, next) => { let { name, password } = ctx.request.body if (name == 'ikcamp' && password == '123456') { ctx.response.body = `Hello, ${name}!` } else { ctx.response.body = '账号信息错误' } } }

修改路由 router.js

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

const router = require('koa-router')()  const HomeController = require('./controller/home')  module.exports = (app) => {    router.get( '/', HomeController.index )        router.get('/home', HomeController.home)        router.get('/home/:id/:name', HomeController.homeParams)        router.get('/user', HomeController.login)        router.post('/user/register', HomeController.register)        app.use(router.routes())      .use(router.allowedMethods())  }

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

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

分离 service 层

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

新建 service/home.js

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

module.exports = {    register: async(name, pwd) => {      let data       if (name == 'ikcamp' && pwd == '123456') {        data = `Hello, ${name}!`      } else {        data = '账号信息错误'      }      return data    }  }

修改 controller/home.js

// 引入 service 文件const HomeService = require('../service/home')module.exports = {  // ……省略上面代码  // 重写 register 方法   register: async(ctx, next) => {    let {      name,      password    } = ctx.request.body    let data = await HomeService.register(name, password)    ctx.response.body = data  }}

重构完成

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

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

1605309af5a7dfa2?w=1426&h=778&f=png&s=414615

3326ff01e1f06fd6dc3c.png

上一篇:iKcamp新课程推出啦~~~~~

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

1.

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

转载于:https://www.cnblogs.com/ikcamp/p/8183099.html

你可能感兴趣的文章
elasticjob 当当的分布式定时任务管理
查看>>
BZOJ 3438: 小M的作物( 最小割 )
查看>>
js性能优化-事件委托(2)
查看>>
Determine File Output Location
查看>>
51NOD 1068 Bash游戏 V3
查看>>
级联。。。
查看>>
socketserver用法列子
查看>>
网站链接被微信屏蔽拦截了怎么办?VJump帮你解除屏蔽
查看>>
SVG.text基本属性
查看>>
Sublime Text3配置Node.js开发环境
查看>>
在线编辑器的原理简单示例
查看>>
MVC弹出子页面向父页面传值
查看>>
用shell定义和访问数组
查看>>
KNN算法原理以及代码实现
查看>>
解读typescript中 super关键字的用法
查看>>
指定IE7(或其他版本)如何访问?
查看>>
iframe 自动适应页面高度
查看>>
eclipse环境下基于tomcat-7.0.82构建struts2项目
查看>>
input标签附带提示文字(bootstrap里面输入框的两侧同时添加额外元素)
查看>>
VHDL硬件描述语言学习笔记---VHDL语言要素
查看>>