位置: IT常识 - 正文

【node进阶】一文带你快速入门koa框架(node l)

编辑:rootadmin
【node进阶】一文带你快速入门koa框架

推荐整理分享【node进阶】一文带你快速入门koa框架(node l),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:nodejs进阶,node-,nodejs进阶之路,node-,nodejs进阶,node 入门,node-,node入门教程,内容如对您有帮助,希望把文章链接给更多的朋友!

✅ 作者简介:一名普通本科大三的学生,致力于提高前端开发能力 ✨ 个人主页:前端小白在前进的主页 🔥 系列专栏 : node.js学习专栏 ⭐️ 个人社区 : 个人交流社区 🍀 学习格言: ☀️ 打不倒你的会使你更强!☀️ 💯 刷题网站:这段时间有许多的小伙伴在问有没有什么好的刷题网站,博主在这里给大家推荐一款刷题网站:👉点击访问牛客网👈牛客网支持多种编程语言的学习,各大互联网大厂面试真题,从基础到拔高,快来体验一下吧!

🔥前言

在现阶段项目开发过程中,虽然express框架仍然占据着主导的地位,但是有部分的公司也使用了Koa框架开发,那么我们仍然需要学习一下Koa框架,本篇文章将从Koa框架的入门以及与Express框架的不同之处做为切入点去讲解!

📃目录Koa框架简介Koa框架的优点Koa框架的缺点快速开始安装KoaHello Koactx对象Koa对比Express更轻量Context对象异步流程控制中间件模型(洋葱模型)小结Koa框架简介

koa 是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的回调函数嵌套,并极大地提升错误处理的效率。koa 不在内核方法中绑定任何中间件,它仅仅提供了一个轻量优雅的函数库,使得编写 Web 应用变得得心应手。

Koa框架的优点Koa提高了互操作性,健壮性,使编写中间件变得更加愉快。集成了大量的web API,但是没有绑定中间件非常轻量,核心的Koa模块只有大约2K行代码拥有非常好的用户体验通过try / catch更好地处理错误异步控制流,代码可读性更高Koa框架的缺点Koa框架的周边生态并无优势与Express风格的中间件并不兼容对开发者要求可能更高一些快速开始安装Koanpm install koa

注意: Koa需要node v7.6.0以上版本支持,因为内部使用了ES6的特性。

Hello Koaconst Koa = require('koa')const app = new Koa()app.use( async ( ctx ) => { ctx.body = 'hello koa2' //ctx.body = '<b>hello koa2</b>' //返回html片段 //ctx.body = {name:'james'} //返回的是json格式数据})app.listen(3000)

注意: 我们默认使用的是Koa2,koa2与koa1的最大区别是koa2实现异步是通过async/await,koa1实现异步是通过generator/yield,Koa2更加的便利,所以默认选用Koa2。

ctx对象

我们在这里可以明显的发现,Koa与Express不同之处在于中间件的形参传的不一样了,我们在Expess中两个参数req,res在这里被ctx所替代了。

ctx全称是context(汉译:上下文),这个在所有语言里都有的名词,可以理解为上(request)下(response)沟通的环境,所以koa中把他们两都封装进了ctx对象,koa官方文档里的解释是为了调用方便 ctx.req=ctx.request,ctx.res=ctx.response,ctx.body = ctx.res.body = ctx.response.body

Koa 提供一个 Context 对象,表示一次对话的上下文(包括 HTTP 请求和 HTTP 回复)。通过加工这个对象,就可以控制返回给客户端的内容。例如上方代码中的ctx.body = 'hello koa2' ,在前端页面中会显示hello Koa2

我们可以在终端打印一下ctx对象:

{ request: { method: 'GET', url: '/favicon.ico', header: { host: 'localhost:3000', connection: 'keep-alive', 'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="101", "Google Chrome";v="101"', 'sec-ch-ua-mobile': '?0', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36', 'sec-ch-ua-platform': '"Windows"', accept: 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8', 'sec-fetch-site': 'same-origin', 'sec-fetch-mode': 'no-cors', 'sec-fetch-dest': 'image', referer: 'http://localhost:3000/', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8', cookie: 'Webstorm-a5eae5c4=895fa835-890a-4be8-97fa-9d70b377e3fc; _ga=GA1.1.1673643516.1666519138' } }, response: { status: 200, message: 'OK', header: [Object: null prototype] { 'content-type': 'text/html; charset=utf-8', 'content-length': '17' } }, app: { subdomainOffset: 2, proxy: false, env: 'development' }, originalUrl: '/favicon.ico', req: '<original node req>', res: '<original node res>', socket: '<original node socket>'}

其实我们很容的发现,它里面的request和reponse其实分别是HTTP Request和HTTP Response,随之进行相应的操作就好了!

补充

ctx.request与ctx.req的区别: ctx.request是context经过封装的请求对象,用起来更直观和简单;ctx.req是context提供的node.js原生HTTP请求对象,可以得到更多的内容。同理ctx.response是context经过封装的响应对象,ctx.res是context提供的node.js原生HTTP响应对象。绕过Koa的response处理是不被支持的,我们应该去避免使用以下node属性: ctx.res.statusCode、ctx.res.writeHead()、ctx.res.write()、ctx.res.end()Koa对比Express

通常都会说 Koa 是洋葱模型,这重点在于中间件的设计。通过分析,会发现 Express 也是类似的,不同的是Express 中间件机制使用了 Callback 实现,这样如果出现异步则可能会使你在执行顺序上感到困惑,因此如果我们想做接口耗时统计、错误处理 Koa 的这种中间件模式处理起来更方便些。最后一点响应机制也很重要,Koa 不是立即响应,是整个中间件处理完成在最外层进行了响应,而 Express 则是立即响应。

更轻量koa 不提供内置的中间件;koa 不提供路由,而是把路由这个库分离出来了(koa/router)Context对象【node进阶】一文带你快速入门koa框架(node l)

koa增加了一个Context的对象,作为这次请求的上下文对象(在koa2中作为中间件的第一个参数传入)。同时Context上也挂载了Request和Response两个对象。和Express类似,这两个对象都提供了大量的便捷方法辅助开发, 这样的话对于在保存一些公有的参数的话变得更加合情合理。

异步流程控制

​ express采用callback来处理异步, koa v1采用generator,koa v2 采用async/await。

​ generator和async/await使用同步的写法来处理异步,明显好于callback和promise,

中间件模型(洋葱模型)

express基于connect中间件,线性模型;

​ koa中间件采用洋葱模型(对于每个中间件,在完成了一些事情后,可以非常优雅的将控制权传递给下一个中间件,并能够等待它完成,当后续的中间件完成处理后,控制权又回到了自己)

代码示例: Express与Koa的同步代码比较: Express:

//同步var express = require("express")var app = express()app.use((req,res,next)=>{ console.log(1) next() console.log(4) res.send("hello")})app.use(()=>{ console.log(3)})app.listen(3000)

最终的打印结果顺序是134,浅而意见的看出Express框架中间件是线性模型,明显有顺序性。 注意: 在一般情况下我们在express框架中的next()下方不会再书写代码,这里只是做对比使用。 Koa:

//同步const koa = require("koa")const app = new koa()app.use((ctx,next)=>{ console.log(1) next() console.log(4) ctx.body="hello"})app.use(()=>{ console.log(3)})app.listen(3000)

最终的打印结果顺序是134,从这里其实并不能看出来Koa的洋葱模型,但是下面的异步代码中可以非常清晰的看出洋葱模型。

Express与Koa的异步代码比较: Express(在这里使用了洋葱模型去书写express,可以发现有不合理的地方):

const express = require("express")const app = express()app.use(async (req,res,next)=>{ console.log(1) await next() console.log(4) res.send("hello")})app.use(async ()=>{ console.log(2) await delay(1000) console.log(3)})function delay(time){ return new Promise((resolve,reject)=>{ setTimeout(resolve,1000) })}

最终的打印结果顺序是1243,在这里大家可能有迷惑的地方,我们第一个中间件中已经具有代码await next()了,那么为什么打印结果不是1234呢?那是因为next()并不是一个promise对象,await只会对promise对象起作用!

Express线性模型的写法:

const express = require("express")const app = express()app.use(async (req,res,next)=>{ console.log(1) await next()})app.use(async ()=>{ console.log(2) await delay(1000) console.log(3) console.log(4) res.send("hello")})function delay(time){ return new Promise((resolve,reject)=>{ setTimeout(resolve,1000) })}

最终的打印结果顺序是1234,在这里就可以明显看出来,第一个中间件执行完后,先打印了1,随后进入第二个中间件,先打印出来2,然后等待一秒钟后,打印了34.

Koa洋葱模型写法:

const koa = require("koa")const app = new koa()app.use(async (ctx,next)=>{ console.log(1) await next() console.log(4) ctx.body="hello"}) app.use(async ()=>{ console.log(2) await delay(1) console.log(3)})function delay(time){ return new Promise((resolve,reject)=>{ setTimeout(resolve,1000) })}app.listen(3000)

最终的打印结果顺序是1234,我们通过分析可以看出来它遵循的就是洋葱模型,第一个中间件打印了1,然后进入第二个中间件,打印2之后,等待一秒,打印出来了3,随后又返回了第一个中间件,打印出4。

通过异步代码的对比,我觉得大家可能看的迷迷糊糊了,可能不明白为什么我们通过打印顺序去观察相应的模型,在实际开发中有什么业务可以满足这种需求呢?假如我们已经进入了一个页面,但是从这个页面再获取一些数据的时候需要携带token才能获取,我们就可以采用洋葱模型。

例如:打印1是代表已经进入了某个页面并且获取了一些公共数据,但是我们现在需要登录用户后才能获取另外一批数据,于是我们进入了第二个中间件,打印2是执行登录过程的业务,登录的进行过程(delay延时1秒钟)度过后,后端返回了token,返回token就是打印3,然后我们又回到第一个中间件,携带token去访问接口获取数据(打印4).

小结

Koa框架明显的好处就是轻量级别,并且有着非常良好的异步体验,本文对Koa框架做一个简单的了解,并且区分了与Express框架的不同之处,至于怎么去选择使用哪个框架,在后面的学习中相信会给大家一个答案的,继续加油吧!少年😀😀

本文链接地址:https://www.jiuchutong.com/zhishi/299512.html 转载请保留说明!

上一篇:【图像分类数据集】非常全面实用的垃圾分类图片数据集共享(图像分类实战)

下一篇:从零开始的「校园商铺」毕设全栈开发—开题报告(从零开始吧)

  • 快手用户怎么开启直播回放(快手用户怎么开放粉丝和列表)

    快手用户怎么开启直播回放(快手用户怎么开放粉丝和列表)

  • 苹果7电池健康怎么看(苹果7电池健康不见了)

    苹果7电池健康怎么看(苹果7电池健康不见了)

  • iphonex没有拒接电话(iphone没有拒接按钮)

    iphonex没有拒接电话(iphone没有拒接按钮)

  • mt192ch/a是翻新机吗(mt192ch/a价格)

    mt192ch/a是翻新机吗(mt192ch/a价格)

  • 苹果手机视频发烫怎么回事(苹果手机视频发不出去是怎么回事)

    苹果手机视频发烫怎么回事(苹果手机视频发不出去是怎么回事)

  • 为啥流量卡开不了微信(流量卡开不起流量怎么回事)

    为啥流量卡开不了微信(流量卡开不起流量怎么回事)

  • iphone7和8的手机壳通用吗(iphone 7和iphone 8)

    iphone7和8的手机壳通用吗(iphone 7和iphone 8)

  • 计算机清屏键是什么(计算机清屏键是ce还是on)

    计算机清屏键是什么(计算机清屏键是ce还是on)

  • iqooneo3有压感按键吗(iqoo3有压感按键)

    iqooneo3有压感按键吗(iqoo3有压感按键)

  • 华为手机怎么群发微信(华为手机怎么群发语音)

    华为手机怎么群发微信(华为手机怎么群发语音)

  • p30拍照为什么模糊(p30拍照为什么模糊不清)

    p30拍照为什么模糊(p30拍照为什么模糊不清)

  • 华为nova5i可以无线充电吗(华为nova5能无线充电吗)

    华为nova5i可以无线充电吗(华为nova5能无线充电吗)

  • word合并两个独立表格(word2019如何合并两个文档)

    word合并两个独立表格(word2019如何合并两个文档)

  • 图片设置四周型环绕怎么设置(图片设置四周型环绕位置为两边)

    图片设置四周型环绕怎么设置(图片设置四周型环绕位置为两边)

  • qq个性赞在哪里设置(qq 个性赞)

    qq个性赞在哪里设置(qq 个性赞)

  • 手机上两张照片怎么合成一张(手机上两张照片合成一张怎么弄)

    手机上两张照片怎么合成一张(手机上两张照片合成一张怎么弄)

  • 手机上怎样设置wifi密码(手机上怎样设置呼叫转移)

    手机上怎样设置wifi密码(手机上怎样设置呼叫转移)

  • iphone11有没有夜景模式(苹果11有夜览模式吗)

    iphone11有没有夜景模式(苹果11有夜览模式吗)

  • 分辨率1080p什么意思(分辨率1080*1080)

    分辨率1080p什么意思(分辨率1080*1080)

  • 什么软件可以查驾驶证分数(什么软件可以查公司信息)

    什么软件可以查驾驶证分数(什么软件可以查公司信息)

  • 怎样把自己的抖音置顶到自己的第一个(怎样把自己的抖音发到微信朋友圈)

    怎样把自己的抖音置顶到自己的第一个(怎样把自己的抖音发到微信朋友圈)

  • 小米手环4怎么听音乐(小米手环4怎么连接)

    小米手环4怎么听音乐(小米手环4怎么连接)

  • 小米9微信提示音怎么改(小米9微信提示音开了,可是还是没有提示)

    小米9微信提示音怎么改(小米9微信提示音开了,可是还是没有提示)

  • 打电话微信也会忙线吗(打电话微信也会中断吗)

    打电话微信也会忙线吗(打电话微信也会中断吗)

  • 苹果x手机录屏功能在哪里(苹果X手机录屏为什么没有声音)

    苹果x手机录屏功能在哪里(苹果X手机录屏为什么没有声音)

  • Linux系统下为Gitlab配置邮件提醒的方法详解(linux中git命令)

    Linux系统下为Gitlab配置邮件提醒的方法详解(linux中git命令)

  • 在html页面以导入的方式使用axios进行异步请求(html页面中利用______标签可引入jquery库)

    在html页面以导入的方式使用axios进行异步请求(html页面中利用______标签可引入jquery库)

  • 增值税的附加税比例
  • 收客户刷卡手续费时客户不愿意缴费,如何处理
  • 电子税务局怎么导出企业所得税报表
  • 税务局三代手续费政策
  • 没有认证的发票怎么做分录
  • 期货平仓费用
  • 财产转让所得的纳税义务发生时间
  • 转业士官自谋职业
  • 股权转让如何避免土地增值税
  • 车辆购置税退税流程
  • 外商企业所得税可享受什么优惠政策
  • 哪些营业外支出要调增
  • 开票商品税收分录怎么写
  • 中方人员取得的工资、薪金所得,征收个人所得税有特别规定吗?
  • 资产负债表用来调节利润的负债
  • 个税专项附加扣除是什么意思
  • 装修的增值税
  • 老板垫付的货款怎么做凭证?
  • 京东白条账单制和订单制是什么样的
  • 交割单和对账单一样吗
  • 授课培训公司免责协议
  • 给员工支付的房租怎么算
  • 无形资产商标转让费计入什么科目
  • PHP:oci_set_client_identifier()的用法_Oracle函数
  • vue做移动端适配最佳解决方案,亲测有效
  • 销售返利计入什么费用
  • 豹七三七粉的价格
  • 预提费用新会计准则叫什么科目
  • wordpress是开源吗
  • 非营利组织免税资格公示
  • 专利权出资会计科目
  • 存货非正常损失进项税额转出
  • 分包工程账务处理
  • transformers document
  • 企业汇算清缴中,A107070表中的数据是自动跳出来嘛
  • 如何解决Vue3没有代码提示问题?
  • centos安装epel
  • 错开、补开发票问题
  • 新收入准则修订的目的
  • centos7自带yum吗
  • Building a HTTP Proxy
  • 海关缴款书能重开吗
  • 当期进项加计额怎么填
  • 免征增值税和增值税免税
  • mysql常见故障
  • 企业支付临时工劳务报酬需要取得发票吗
  • 免费给人一些客户资料违法吗
  • 疫情期间免征什么税
  • 小规模公司用什么成本核算方法
  • 实际发放工资的会计处理
  • 业务招待费税务扣除标准
  • 小规模纳税人超过30万是全额纳税吗
  • 预付账款的账务处理例题
  • extra backup
  • centos7.2安装
  • 微软桌面 ios
  • win7users移动其它盘
  • win8旗舰版和专业版区别
  • windows储存池写入缓存
  • windowsxp教程
  • windows1020h2版本怎么样
  • Win10打开或关闭系统图标里开怎么灰色的
  • linux的curl
  • opengl画矩形函数
  • android游戏开发框架
  • ja开发
  • java栈怎么写
  • yarn功能
  • python生成随机数表
  • 经常用到的图像格式有
  • 死循环代码
  • js教程
  • 玩转兽世:兽夫,亲一个
  • 四川省 税务局
  • 未开票收入如何申报增值税
  • 河南电子税务局官网app
  • 个人外汇收入申报
  • 厦门市税务局电话
  • 杨静儿多少岁
  • 销货清单表格的制作方法
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设