当前位置: 首页 > 后端技术 > Node.js

ExpressVSKoa的Node.js框架对比

时间:2023-04-03 18:49:15 Node.js

Node.js开发介绍,不得不提一下最火的两个框架Express和Koa。Express已经诞生了一段时间。是一个基于Node.js平台的极简灵活的Web应用开发框架。它主要基于Connect中间件,封装了路由、视图处理等功能。它拥有大量的用户。Koa比较年轻。是原Express团队基于ES7新特性重新开发的框架。框架本身不包含任何中间件,很多功能需要第三方中间件来解决。但由于其基于ES7异步特性的异步流程控制,解决了“回调地狱”和麻烦的错误处理问题,深受开发者欢迎。Koa已经升级到2.x,下面的代码示例将使用Koa2.x。在示例HelloWorld中创建一个基本的web服务非常简单,写法也基本相同。最大的区别在于路由处理Express是自己集成的,而Koa需要引入中间件。//Expressconstexpress=require('express')constapp=express()app.get('/',function(req,res){res.send('HelloExpress')})app.listen(3000)//KoaconstKoa=require('koa')constroute=require('koa-route')constapp=newKoa()app.use(route.get('/',async(ctx)=>{ctx.body='HelloKoa'}))app.listen(3000)ViewsExpress自身集成了视图功能,提供了consolidate.js功能,支持几乎所有的JavaScript模板引擎,提供了便捷的视图设置方法。koa需要引入koa-views中间件。//Expressconstexpress=require('express')constapp=express()app.set('views',__dirname+'/views')app.set('viewengine','pug')app.get('/',function(req,res){res.render('index',{title:'Express'})})//KoaconstKoa=require('koa')constroute=require('koa-route')constviews=require('koa-views')constapp=newKoa()应用程序。使用(视图(路径。加入(__dirname,'./views'),{扩展名:'哈巴狗'}))应用程序。use(route.get('/',async(ctx)=>{awaitctx.render('index',{title:'Koa'})}))中间件模型区别koa中间件采用洋葱圈模型,都请求在经过中间件的时候会执行两次,很方便执行一些后处理逻辑。例如,我们经常需要计算一个请求的响应时间。在Koa中,我们可以在中间件的开头记录初始时间。当响应返回时,代码执行返回到原始中间件。此时根据当前时间与初始时间的时间差即为响应时间。functionresponseTime(){returnasyncfunctionresponseTime(ctx,next){conststart=Date.now()awaitnext()//等待其他中间件运行constdelta=Math.ceil(Date.now()-start)ctx.set('X-Response-Time',delta+'ms')})}}在Express中,当response返回时,代码执行不会返回到原来的中间件。这个时候,我们就需要听听响应了。writeHead获取响应返回的时间:constonHeaders=require('on-headers')functionresponseTime(){returnfunctionresponseTime(req,res,next){conststartAt=process.hrtime()onHeaders(res,functiononHeaders(){constdiff=process.hrtime(startAt)consttime=diff[0]*1e3+diff[1]*1e-6res.setHeader('X-Response-Time',time+'ms')})接下来()}}异常处理Express使用“错误优先回调”的Node约定来处理异常并通过中间件传播它们。Koa以同步的方式编写异步代码,可以通过trycatch来处理异常,这是很自然的。//Expressapp.use(function(err,req,res,next){res.status(err.status||500).send('error')})//Koaapp.use(async(ctx,next)=>{try{awaitnext()}catch(err){ctx.app.emit('error',err)ctx.status=err.status||500ctx.body={message:err.message}}})ContextKoa新增了一个Context对象来替代Express中的Request和Response作为请求的上下文对象。除了Context上的Request和Response对象,还有Node.js原生提供的req、res、socket等对象。