express与koa的使用对比(详细教程)

很多人都在问到底该用koa还是express,所以下面这篇文章就来给大家再次的对比了关于expresskoa的相关资料,通过对比大家可以更好的进行选择,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着我来一起学习学习吧。

前言

提到Node.js开发,不得不提目前炙手可热的2大框架express和koa。Express诞生已有时日,是一个简洁而灵活的web开发框架,使用简单而功能强大。Koa相对更为年轻,是Express框架原班人马基于ES6新特性重新开发的敏捷开发框架,现在可谓风头正劲,大有赶超Express之势。

Express和koa都是服务端的开发框架,服务端开发的重点是对HTTP Request和HTTP Response两个对象的封装和处理,应用的生命周期维护以及视图的处理等。

Express主要基于Connect中间件框架,功能丰富,随取随用,并且框架自身封装了大量便利的功能,比如路由、视图处理等等。而koa主要基于co中间件框架,框架自身并没集成太多功能,大部分功能需要用户自行require中间件去解决,但是由于其基于ES6 generator特性的中间件机制,解决了长期诟病的“callback hell”和麻烦的错误处理的问题,大受开发者欢迎。

以前其实写过一篇express和koa的对比, 但是后来发现里面有不少谬误. 所以一直惦记着纠正一下之前的错误, 尤其关于中间件部分的对比.

这里的express就拿更加简单的connect代替

connect的执行流程
通常我们都说connect的中间件模型是线性的, 也就是一个一个往下执行的, 如下图:

express与koa的使用对比(详细教程)

这么说当然是没错的, 但是当我们执行下面代码的时候可能会有那么一点小小的困惑:

const connect = require('connect')const app = connect()app.use(function m1 (req, res, next) { console.log('m1') next() console.log('m1 end')})app.use(function m2 (req, res, next) { console.log('m2') next() console.log('m2 end')})app.use(function m3 (req, res, next) { console.log('m3') res.end('hello')})app.listen(8080)

登录后复制

当我们访问http://127.0.0.1:8080的时候, 控制台会打印如下:

m1m2m3m2 endm1 end

登录后复制登录后复制

这么个结果跟我们上面的模型似乎有点出入, 不是说线性的吗, 为什么next后面的代码还会继续执行? 当然这个我们再之前已经有过结论了, 有兴趣的可以详细瞧瞧, 我们现在直接拿来结果, connect的中间件模型伪代码表示如下:

http.createServer(function (req, res) { m1 (req, res) { m2 (req, res) { m3 (req, res) {} } }})

登录后复制

可以看到就是一层一层嵌套的回调, 那么再把我们之前有点疑问的代码简化一下:

http.createServer(function (req, res) { console.log('m1') m1 (req, res) { console.log('m2') m2 (req, res) { m3 (req, res) { console.log('m3') res.end('hello') } } console.log('m2 end') } console.log('m1 end')})

登录后复制

千万别被上面的回调绕晕了, 就是很简单的回调函数, 一切都解释的通了: 即使res.end之后, 我们的代码还是要继续往下走的, 可以这么说connect的中间件其实也是洋葱形的, 但是因为作为同步代码, 一般不回这么做罢了, 那么上面我们可以重现描述一下connect的中间件模型了:

express与koa的使用对比(详细教程)

Koa的执行流程

同样我们再Koa源码分析, 也是说过Koa的中间件模型: 洋葱形

express与koa的使用对比(详细教程)

以下面代码为例:

const Koa = require('koa')const app = new Koa()app.use(async function m1 (ctx, next) { console.log('m1') await next() console.log('m1 end')})app.use(async function m2 (ctx, next) { console.log('m2') await next() console.log('m2 end')})app.use(async function m3 (ctx) { console.log('m3') ctx.body = 'hello'})app.listen(8080)

登录后复制

访问服务, 输出:

m1m2m3m2 endm1 end

登录后复制登录后复制

emm 貌似跟connect没差别, 之前看过一篇文章, 实验到这里得到了一个koa和express的中间件模型没差别的结论, 包括我也是很迷惑, 当然是有差别的, 结论后面讲. 同样这里直接拿出koa中间件的简化模型:

Promise.resolve(async m1 () { console.log(m1) await Promise.resolve(async m2 () { console.log(m2) await Promise.resolve(async m3 () { console.log(m3) ctx.body = 'xxx' }) console.log(m2 end) }) console.log(m1 end)})

登录后复制

我们知道async/await的作用是’同步化’异步操作(看上去如此, 其实不是, 但是我们不需要去管), 那这里的Promise理所当然的被’同步’了, 也就是说console.log(m3 end)的一切异步操作都可以’同步化’.

结论

说出结论之前我们其实可以想一下, 既然connect的中间件也是洋葱形的, 那么跟koa一样的用法似乎也没啥毛病, 那么我来设想一下, 我们的服务需要取数据库里的的一个用户假设是getUser吧, getUser当然是异步的. 分别来看看connect和koa的做法吧:

// connectapp.use(function (req, res) { getUser(user => res.end(user))})// Koaapp.use(async (ctx) => { const user = await getUser() ctx.body = user})

登录后复制

当然这么看似乎没啥差别. 那直接给出结论吧(憋): connect的中间件是同步, 不会’等’其他异步操作, koa则可以’等’异步操作. 当然你不等也没啥问题.

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

在nodejs中通过redis作为缓存实现的封装缓存类

在nodejs中通过redis作为缓存实现的封装缓存类

在nodejs中通过redis作为缓存实现的封装缓存类

以上就是express与koa的使用对比(详细教程)的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/3185882.html

(0)
上一篇 2025年3月31日 22:39:13
下一篇 2025年3月5日 12:25:40

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 在nodejs+express中如何实现文件上传

    这篇文章主要介绍了使用nodejs+express完成简单的文件上传功能,需要的朋友可以参考下 1.建立express项目 express -e nodejs-uploadfile 登录后复制 2.下载multer中间件 npm i mul…

    编程技术 2025年3月31日
    100
  • React对服务端进行渲染改造

    这次给大家带来React对服务端进行渲染改造,React对服务端进行渲染改造的注意事项有哪些,下面就是实战案例,一起来看一下。 因为对网页SEO的需要,要把之前的React项目改造为服务端渲染,经过一番调查和研究,查阅了大量互联网资料。成功…

    2025年3月31日
    100
  • 分享Express + Node.js实现登录拦截器详解

    本篇文章主要介绍了express + node.js实现拦截器的实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 介绍 这边的拦截器,对应于spring MVC中的filter,所有的http请求,通过拦…

    编程技术 2025年3月31日
    100
  • Linux下详解xargs命令并对比与管道的区别

    为什么要用xargs,问题的来源 在工作中经常会接触到xargs命令,特别是在别人写的脚本里面也经常会遇到,但是却很容易与管道搞混淆,本篇会详细讲解到底什么是xargs命令,为什么要用xargs命令以及与管道的区别。为什么要用xargs呢,…

    编程技术 2025年3月30日
    100
  • 实战案例中使用morgan(附代码)

    这次给大家带来实战案例中使用morgan(附代码),实战案例中使用morgan的注意事项有哪些,下面就是实战案例,一起来看一下。 章节概览 morgan是express默认的日志中间件,也可以脱离express,作为node.js的日志组件…

    编程技术 2025年3月30日
    100
  • 利用node.js等技术如何实现登录注册功能?

    这篇文章主要介绍了node.js+express+mysql+ejs+bootstrop实现网站登录注册功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下 同志们,经过不懈的努力,查了各种文档,终于鼓捣出了一个稍微像样一点的node项目…

    2025年3月30日
    100
  • 在express+mockjs中如何实现后台数据发送

    这篇文章主要介绍了express+mockjs实现模拟后台数据发送功能,需要的朋友可以参考下 前言:   大多数时候,前端会和后端同时进行开发,即在我们开发完页面的时候,很可能还不能立马进入联调阶段,这个时候,为了保证我们接口的有效性和代码…

    2025年3月30日
    100
  • 使用mock.js生成随机数据

    这篇文章主要介绍了使用mock.js随机数据和使用express输出json接口的实现方法,需要的朋友可以参考下 前端项目都会用到后端的接口,但当后台接口没有写好的时候,这时候可以用mock.js先随机生成一些假数据来调试页面 安装mock…

    2025年3月30日
    100
  • nodejs+express做出文件上传

    这次给大家带来nodejs+express做出文件上传,nodejs+express做出文件上传的注意事项有哪些,下面就是实战案例,一起来看一下。 本文实例讲述了nodejs基于express实现文件上传的方法。分享给大家供大家参考,具体如…

    编程技术 2025年3月30日
    100
  • express和laravel哪个好

    laravel好,有以下几点原因:1、Laravel使用PHP语言,具有优雅和直观的语法,并提供大量的功能和工具;2、Laravel有各种各样的扩展包、插件和解决方案;3、Laravel有非常完善和易懂的官方文档;4、Laravel对数据安…

    2025年3月30日
    100

发表回复

登录后才能评论