视频地址:https://www.cctalk.com/v/15114923889408
文章在前面几节中,我们已经实现了项目中的几个常见操作:启动服务器、路由中间件、Get 和 Post 形式的请求处理等。现在你已经迈出了走向成功的第一步。
目前,整个示例中所有的代码都写在 app.js 中。然而在业务代码持续增大,场景更加复杂的情况下,这种做法无论是对后期维护还是对患有强迫症的同学来说都不是好事。所以我们现在要做的就是:『分梨』。
分离 router路由部分的代码可以分离成一个独立的文件,并根据个人喜好放置于项目根目录下,或独立放置于 router 文件夹中。在这里,我们将它命名为 router.js并将之放置于根目录下。
修改路由 router.jsconst router = require("koa-router")() module.exports = (app) => { router.get("/", 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.jsindex 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 = `
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 = `` }, 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.jsindex 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 = `
修改 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 默认支持的模板引擎
上一篇:iKcamp新课程推出啦~~~~~iKcamp|基于Koa2搭建Node.js实战(含视频)☞ HTTP请求推荐: 翻译项目Master的自述: 1. 干货|人人都是翻译项目的Master 2. iKcamp出品微信小程序教学共5章16小节汇总(含视频)
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/90638.html
摘要:玩转同时全面掌握潮流技术采用新一代的开发框架更小更富有表现力更健壮。融合多种常见的需求场景网络请求解析模板引擎静态资源日志记录错误请求处理。结合语句中转中间件控制权,解决回调地狱问题。注意分支中的目录为当节课程后的完整代码。 ?? 与众不同的学习方式,为你打开新的编程视角 独特的『同步学习』方式 文案讲解+视频演示,文字可激发深层的思考、视频可还原实战操作过程。 云集一线大厂...
摘要:云集一线大厂有真正实力的程序员团队云集一线大厂经验丰厚的码农,开源奉献各教程。融合多种常见的需求场景网络请求解析模板引擎静态资源日志记录错误请求处理。结合语句中转中间件控制权,解决回调地狱问题。注意分支中的目录为当节课程后的完整代码。 ?? 与众不同的学习方式,为你打开新的编程视角 独特的『同步学习』方式 文案讲解+视频演示,文字可激发深层的思考、视频可还原实战操作过程。 云...
POST/GET请求——常见请求方式处理 ?? iKcamp 制作团队 原创作者:大哼、阿干、三三、小虎、胖子、小哈、DDU、可木、晃晃 文案校对:李益、大力萌、Au、DDU、小溪里、小哈 风采主播:可木、阿干、Au、DDU、小哈 视频剪辑:小溪里 主站运营:给力xi、xty 教程主编:张利涛 视频地址:https://www.cctalk.com/v/15114357765870 ...
视频地址:https://www.cctalk.com/v/15114923888328 showImg(https://segmentfault.com/img/remote/1460000012744407?w=1602&h=966); 视图 Nunjucks 彩虹是上帝和人类立的约,上帝不会再用洪水灭人。 客户端和服务端之间相互通信,传递的数据最终都会展示在视图中,这时候就需要用到『模板引擎...
视频地址:https://www.cctalk.com/v/15114923886141 showImg(https://segmentfault.com/img/remote/1460000012840997?w=1604&h=964); JSON 数据 我颠倒了整个世界,只为摆正你的倒影。 前面的文章中,我们已经完成了项目中常见的问题,比如 路由请求、结构分层、视图渲染、静态资源等。 那么,J...
阅读 2532·2021-11-22 12:01
阅读 1060·2021-11-15 11:37
阅读 3646·2021-09-22 14:59
阅读 1690·2021-09-04 16:45
阅读 1356·2021-09-03 10:30
阅读 971·2021-08-11 11:18
阅读 2419·2019-08-30 10:53
阅读 1984·2019-08-29 15:13