koa2和expres的区别是什么

Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强try catch错误处理。

express自身集成了路由视图处理等功能,koa本身不集成任何的中间件,需要配置路由视图等中间件进行开发;

 一个简单的Express服务器

const express = require('express');
const app = express();

/* 中间件 */
app.use((req, res, next) => {
    console.log('middleware');
    next();
    console.log('middleware call');
});

/* 路由部分 */
const router = express.Router();
router.get('/', (req, res) => {
    res.send('Home');
});

app.use(router);

/* 静态文件 */
app.use(express.static('./'));

app.listen(3000);

一个简单的Koa服务器

const Koa = require('koa');
const Router = require('koa-router');
const serve = require('koa-static');

const app = new Koa();
const router = Router();

/* 中间件 */
app.use(async (ctx, next) => {
    console.log('middleware');
    next();
    console.log('middleware call');
});

/* 路由部分 */
router.get('/', (ctx) => {
    ctx.body = 'Home';
});
app.use(router.routes());

/* 静态文件 */
app.use(serve('./'));

app.listen(3000);

用法的区别
Express是基于回调,(第一个参数是error对象)
Koa是使用的号称异步终极解决方案的Async/Await,也就是基于Promise,使用Try-Catch来捕获错误

中间件的区别
Express的中间件是线性模型
Koa的中间件是洋葱模型

中间件模型:express基于connect中间件,线性模型,koa中间件采用的是洋葱模型,所有的请求在经过中间件的时候都会执行俩次,能够非常方便的后置一些处理逻辑;

集成度
Express自带了Router和Static的中间件
Koa需要自行安装Router和Static的中间件

社区活跃度
可以看到搜索koa,npm上相关包只有5000多个,而搜索express则有两万多个,所以就目前来说koa的社区活跃度是不如express的。

context:和express只有request和response俩个对象不同,koa增加了一个context的对象,作为这次请求的上下文对象(在koa1中为中间件的this,在koa2中作为中间件的第一个参数传入),同时,context上也挂在了request和response俩个对象,和express类似,这俩个对象提供了大量的边界方法辅助开发。

异常处理

Express的异常处理是有一个error处理中间件完成的,由于Express的中间件时线性流程,所以要处理错误信息就必须把error中间件放到最后。

//错误优先的原则
app.use('*',route)
//必须有四个参数,即使函数中写next(),执行完这个也不会往下走,有两个错误处理中间件,也只会执行前面那个,最好放到最后,与顺序有关系得
app.use(function (err, req, res, next) {
  console.log(err.stack);
  res.status(200).send('somting is wrong!')
})

 

server.use((req, res, next)=>{
  console.log('进入了中间件中1......');

  // 发生错误
  'fadsfasd'.map(item=>{
    console.log(item);
  })
//next()不会执行,发生错误后直接执行错误中间件
  next();
});
server.use(function (err, req, res, next) {
  console.log(err.stack);
  res.status(200).send('somting is wrong!')
})

洋葱模型

const Koa = require('koa');

// 应用程序
const app = new Koa();

// 中间件1
app.use((ctx, next) => {
    console.log(1);
    next();
    console.log(2);
});

// 中间件2
app.use((ctx, next) => {
    console.log(3);
    next();
    console.log(4);
});

app.listen(9000, '0.0.0.0', () => {
    console.log(`Server is starting`);
});
————————————————
版权声明:本文为CSDN博主「willemwei023」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/willemwei023/article/details/105904911

控制台会有如下打印: 

1
3
4
2

其实很明显,在koa的中间件中,通过next函数,将中间件分成了两部分,next上面的一部分会首先执行,而下面的一部分则会在所有后续的中间件调用之后执行。

 

我们看第二张图,其实不难发现,会有两次进入同一个中间件的行为,而且是在所有第一次的中间件执行之后,才依次返回上一个中间件。

洋葱模型的好处,对后续中间件返回的结果进行处理。这也解释了我们为什么需要保证洋葱模型 

Koa2和Egg的区别

诞生原因:Egg定位于企业级应用开发 (引入 Router-路由,Config-基础配置,Logger-日志,定时任务)按照功能特点每一类文件必须按照约定放在对应目录,遵循约定使处理自动化,比如中间件要放在middleware目录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值