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

基于Nodejs平台的Web框架-ExpressVSKoa

时间:2023-04-03 12:16:13 Node.js

Express和Koa都是基于Nodejs平台的Web框架,是目前比较常见的快速开发Web服务的框架,都是基于中间件处理客户端请求,那么两者有什么区别呢?简单来说就是“Express是线性模型,Koa是洋葱模型”。(Slogan!!!)让我们看看下面的示例代码://forexpressexampleconstexpress=require('express');constapp=express();functioncb1(req,res,next){console.日志('>>>>>>cb1');下一个();console.log('<<<<<<>>cb2<<<');res.send('helloworld');}app.use('/',[cb1,cb2]);app.listen(3000);//对于koa2exampleconstkoa=require('koa2');constapp=koa();functioncb1(ctx,next){console.log('>>>>>>cb1');下一个();console.log('<<<<<>>cb2<<<');ctx.body='helloworld';}app.use(cb1);app.use(cb2);app.listen(3000);以上两段代码输出结果为:>>>>>>cb1>>>cb2<<<<<<<<>>>>>cb1');等待下一个();console.log('<<<<<{setTimeout(resolve,500);}).then(()=>{console.log('>>>cb2<<<');res.send('helloworld');});}app.use('/',[cb1,cb2]);app.listen(3000);//对于koa2exampleconstkoa=require('koa2');constapp=newkoa();asyncfunctioncb1(ctx,next){console.log('>>>>>>cb1');等待下一个();console.log('<<<<<{setTimeout(resolve,500);}).then(()=>{console.log('>>>cb2<<<');ctx.body='helloworld';});}app.use(cb1);app.use(cb2);app.listen(3000);express-example的输出是:>>>>>>cb1>>>>>>cb1>>>cb2>>>koa2-example的输出是:>>>>>>cb1>>>cb2<<<<<<<<3){//不是标准的请求处理程序returnnext();}try{fn(req,res,next);}赶上(犯错){下一个(犯错);}};在Koa2中,执行中间件的发布代码主要位于koa-compose/index.js文件:functioncompose(middleware){if(!Array.isArray(middleware))thrownewTypeError('Middlewarestackmustbeanarray!')for(constfnofmiddleware){if(typeoffn!=='function')thrownewTypeError('中间件必须由函数组成!')}/***@param{Object}context*@return{Promise}*@apipublic*/returnfunction(context,next){//最后调用的中间件#letindex=-1returndispatch(0)functiondispatch(i){if(i<=index)returnPromise.reject(newError('next()calledmultipletimes'))index=iletfn=middleware[i]if(i===middleware.length)fn=nextif(!fn)返回Promise.resolve()try{returnPromise.resolve(fn(context,functionnext(){returndispatch(i+1)}))}catch(err){returnPromise.reject(err)}}}}我们可以看到由上可知,Express中中间件的next参数是一个普通的函数对象,而Koa中中间件的next参数是一个promise对象,所以当我们挂载异步中间件时,Express不能像Koa那样使用中间件中的await来等待一个中间件后执行完毕,执行当前中间件的后续逻辑。这就是“Express是线性模型,Koa是洋葱模型”的根本原因。以上就是我对Express和Koa框架的理解,希望对大家有所帮助。以上内容如有错误,请指正,谢谢~