NodeJS之Koa和Express框架的比较小记

一、基本概述

Koa框架和Express框架是Node生态圈比较流行的Node Web框架,能够利用这两个框架快速建立web应用。那koa和express这两个框架有什么区别呢?

二、具体比较

1、框架体量:Express框架集成了路由、静态文件功能模块,而Koa框架只提供了web服务,所以Koa相对于Express更轻量级;

实现功能点:基本的路由、静态文件功能的Web服务

//Koa版本:利用Koa框架实现路由、静态文件、web服务需要额外引入第三方依赖,Koa框架本身只提供了web服务
const Koa = require("koa");
const Router = require("koa-router");   //引入路由
const Static = require("koa-static");   //引入静态文件服务

const app = new Koa();
const router = new Router();
router.get("/testApi",async (ctx,next)=>{
    const response = ctx.response;
    response.set("Content-Type","text/html;charset=utf-8");
    response.body = "<h1>/testApi接口测试成功";
});

//注入中间件
app.use(router.routes());
app.use(router.allowedMethods());
app.use(Static("public"));

const PORT = 3000;
const HOST = "localhost"
app.listen(PORT,HOST,function(){
    console.log(`http://${HOST}:${PORT} 服务启动成功`); 
});
//Express版本:利用Express框架实现路由、静态文件、web服务,不需要额外引入第三方,Express本身集成
const Express = require("express");
const app = Express();
const router = Express.Router();

router.get("/testApi",(req,res,next)=>{
    res.send(`<h1>/testApi服务启动成功!</h1>`)
});

app.use(Express.static("public"));
app.use(router);

const PORT = 3000;
const HOST = "localhost"
app.listen(PORT,HOST,function(){
    console.log(`http://${HOST}:${PORT} 服务启动成功`); 
});

2、 中间件机制:这两种框架都使用了中间件机制实现web应用功能增强,源码中都是通过middleware数组存储中间件功能函数,同时根据洋葱模型机制实现中间件功能触发;

洋葱模型:该模型机制主要为了实现功能增强,在核心代码前后实现相应的功能增强,类似于Aop面向切面编程(@Aroud环绕通知),例如日志记录、报错处理等增强功能;洋葱模型设计图如下:

在这里插入图片描述

Express版本:Express中间件执行机制也是洋葱模型;但是由于Express框架对HTTP异步请求采用回调方式处理,不会等待Promise执行完成,所以有时候洋葱模型执行中间并不是那么可靠;例如在如下代码,添加静态文件功能,就会出现不符合洋葱模型的运行方式;

const Express = require("express");
const app = Express();
const router = Express.Router();

router.get("/testApi",(req,res,next)=>{
    console.log("/testApi开始访问");
    res.send1(`<h1>/testApi服务启动成功!</h1>`)
});

function MiddleWareA(req,res,next){
    console.log("请求开始日志");
    next();
    console.log("请求结束日志");
}
function MiddleWareB(req,res,next){
    console.log("报错开始日志");
    next();
    console.log("报错结束日志")
}
app.use(MiddleWareA);
app.use(MiddleWareB);
//app.use(Express.static("public"));  //先注释可以看到洋葱模型运行方式
app.use(router);

const PORT = 3000;
const HOST = "localhost"
app.listen(PORT,HOST,function(){
    console.log(`http://${HOST}:${PORT} 服务启动成功`); 
});

在这里插入图片描述

(正常版本)

在这里插入图片描述

(非正常版本)

Koa版本:Koa中间件执行机制严格按照洋葱模型;由于Koa框架利用async/await语法等待Promise执行完成,如果不采用该语法定义中间件函数,也会出现Express的情况,同时Koa web路由服务无法访问;


const Koa = require("koa");
const Router = require("koa-router");   //引入路由
const Static = require("koa-static");   //引入静态文件服务

const app = new Koa();
const router = new Router();
router.get("/testApi",async (ctx,next)=>{
    const response = ctx.response;
    console.log("/testApi接口开始访问");
    response.set("Content-Type","text/html;charset=utf-8");
    response.body = "<h1>/testApi接口测试成功";
});

async function MiddleWareA(ctx,next){
    console.log("请求开始日志");
    await next();
    console.log("请求结束日志");
}
async function MiddleWareB(ctx,next){
    console.log("报错开始日志");
    await next();
    console.log("报错结束日志")
}
//注入中间件
app.use(MiddleWareA);
app.use(MiddleWareB);
app.use(router.routes());
app.use(router.allowedMethods());
app.use(Static("public"));

const PORT = 3000;
const HOST = "localhost"
app.listen(PORT,HOST,function(){
    console.log(`http://${HOST}:${PORT} 服务启动成功`); 
});

在这里插入图片描述

3、 异步处理方式:Express框架采用Callback回调函数的方式处理异步功能,它不会等到Promise执行完成;而Koa2框架采用async/await语法特性处理异步功能,可以通过该语法可以等到Promise执行完成;

4、 报错处理机制:Express对报错处理不太友好,如果控制器(路由函数)中出现错误代码,Express直接抛出报错,无法通过try,catch语法进行拦截处理;Koa框架可以定义报错中间件,对控制器出现的报错进行统一处理拦截;

4、 中间件对响应对象的处理:Koa框架能够在中间件中直接修改Response响应对象,而Express框架在中间件中不能修改Response响应对象,如果修改会产生报错信息;报错信息如下:

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:533:11)
    at ServerResponse.header (E:\koa-pro\node_modules\express\lib\response.js:771:10)
    at ServerResponse.send (E:\koa-pro\node_modules\express\lib\response.js:170:12)
    at MiddleWareB (E:\koa-pro\expresspro.js:19:9)
    at Layer.handle [as handle_request] (E:\koa-pro\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (E:\koa-pro\node_modules\express\lib\router\index.js:317:13)
    at E:\koa-pro\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (E:\koa-pro\node_modules\express\lib\router\index.js:335:12)
    at next (E:\koa-pro\node_modules\express\lib\router\index.js:275:10)
    at MiddleWareA (E:\koa-pro\expresspro.js:12:5)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Node.js 中使用 Koa 框架进行事务管理可以使用以下两种方式: 1. 使用数据库事务:如果你使用的是支持事务的数据库(如 MySQL、PostgreSQL 等),那么你可以使用数据库提供的事务功能来管理事务。在 Koa 中,你可以使用像 Sequelize 这样的 ORM 库来管理数据库操作。 例如,在 Sequelize 中使用事务的代码示例: ``` // 创建一个事务 const transaction = await sequelize.transaction(); try { // 在事务中执行数据库操作 await User.create({ name: 'John Doe' }, { transaction }); await Profile.create({ userId: 1, bio: 'Hello, world' }, { transaction }); // 提交事务 await transaction.commit(); } catch (error) { // 回滚事务 await transaction.rollback(); } ``` 在上面的示例中,我们使用了 `sequelize.transaction()` 方法来创建一个事务,并将其传递给每个数据库操作。如果其中任何一个操作失败,那么事务将会回滚,所有操作都将被撤销。 2. 使用 Koa 中间件:另一种管理事务的方法是使用 Koa 中间件来实现。你可以编写一个中间件函数,将所有需要在事务中执行的操作包裹起来,并在出现错误时回滚事务。 例如,在 Koa 中使用中间件管理事务的代码示例: ``` app.use(async (ctx, next) => { const transaction = await sequelize.transaction(); try { // 将事务对象绑定到上下文对象中 ctx.transaction = transaction; // 执行下一个中间件 await next(); // 提交事务 await transaction.commit(); } catch (error) { // 回滚事务 await transaction.rollback(); // 抛出错误 throw error; } }); // 在路由中使用事务 router.post('/users', async (ctx) => { // 从上下文对象中获取事务对象 const transaction = ctx.transaction; try { // 在事务中执行数据库操作 await User.create({ name: 'John Doe' }, { transaction }); await Profile.create({ userId: 1, bio: 'Hello, world' }, { transaction }); // 发送响应 ctx.body = { success: true }; } catch (error) { // 如果发生错误,将会自动回滚事务 throw error; } }); ``` 在上面的示例中,我们编写了一个 Koa 中间件函数,该函数会在每个请求中创建一个事务,并将其绑定到上下文对象中。在路由处理函数中,我们可以从上下文对象中获取事务对象,并使用它来执行数据库操作。如果任何一个操作失败,中间件将会回滚事务,并将错误抛出到全局错误处理函数中。 总的来说,使用数据库事务或 Koa 中间件来管理事务都是有效的方式。选择哪种方式取决于你的具体需求和项目的架构。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值