nodejs框架Koa做中间层使用总结(含示例)

1. Koa是什么?

一个以nodejs为基础的一个后台框架。直白一点来说,就是一个javascript语言需要编写的库,它的定位是作为服务端应用提供服务,本身对外暴露了一些api,同时也融合了比较好的思想进去。

640?wx_fmt=png

2. Koa的出现

首先我理解koa的出现绝对不是为了取代现在已有的一些老牌后台语言框架,因为nodejs本身的一些短板和庞大而又历史悠久老牌后台语言,取代是不现实的,只能说各有所长,相互补短,协同提供服务才是正确的。 


3. 真实的项目背景

最近正好公司有一个新项目启动,我也正好借此总结一下。首先公司的底层服务与人员配置均是java标准来分配的,应用本身也是涉及到支付等对可靠性安全性等较高标准的,但是后端的架构是以微服务的方式对外提供服务。

这时候面临了一个问题,像首页这类信息量大的页面,所要展示数据比较分散,需要多个服务一起提供接口,便导致了前端一个页面涉及到多个http请求,因为后端在微服务化下,没有一个合适的服务去承接聚合数据的功能,而对前端来说,很多个http请求的开销下造成的用户体验问题是不能忽视的,这时候就需要一个聚合业务层来承接。

这一层的目的也很明确,就是处理底层数据给前端层面,但是这就涉及到了谁来做这一层的问题,当然任何一个可提供服务的后端框架都是可以做这一层的,而对于有底层服务提供的同学再来关注这一层是没有太多营养的,这时候前端同学便可以利用自己本身的javascript技能功底,使用nodejs的后端框架来承接这一层,就比如上面所说的koa框架便非常合适。

但是也有一个问题,因为项目所需要的可靠性较高,而javascript本身弱语言类型再加上nodejs单进程本身比较脆弱,所以我们将nodejs所提供的中间层定位为只将查询类接口由此封装,而涉及的提交等操作类接口还是走原来底层业务系统来提供服务,这样便将本身的底层服务与新增的聚合层服务完美结合到一起,相互协作提供服务。


以下是一个简单的架构图,可供参考:

640?wx_fmt=png

4. Koa中间层的好处

1. 语言优势:Koa是基于javascript的开发,这是比较大的一个好处,因为能够让前端们更轻松的上手。

2. 提效:方便自己页面调整数据时能够独立的完成调整,而不是跨团队效率底下的沟通工作。

3. 聚合:后端微服务体系势必存在多个数据提供者的问题,如果多次http请求,用户体验有可能变差,所以聚合业务数据也是很重要的作用。

4. 拓宽技术视野:一般前端工程师都是不能非常好的了解技术架构和业务模型,加入这一层后,前端们从页面层到接口层,可以站到更高的位置去看自己做的事情,如数据的一些流转链路方式等,还可以拓宽自己的技术,逐步变成一个技术全能选手。


5. Koa的技术模型

Koa相对于比较老牌的nodejs框架express非常明显的优点是它的"洋葱圈"模型,因为它内部利用了ES6的generate生成器函数,Koa2的版本中直接使用ES7的async语法,这样便能够更好的处理异步写法,告别难看的回调地狱。另一个就是它强大的插件式中间件能力,非常好的扩展能力,可以定制的请求处理模块,而且社区也有很多贡献的中间件模块,可提供使用。


6. Koa入门示例

下面实现一个简单使用Koa搭建服务的例子?

① 实现目标:

  • 提供http和https的服务

  • 实现查询第三方接口服务并提供json接口给前端

 
 
nvm install 8  //8以上可以使用最新语法	
nvm use 8	
npm i --save koa


② 目录结构:

640?wx_fmt=png


③ 实现代码:

 
 
const http = require('http');	
const https = require('https');	
const Koa = require('koa');	
const fs = require('fs');	
const axios = require('axios');	
	
const app = new Koa();	
	
app.use(async (ctx, next) => {	
  const now = Date.now();	
  await next();	
  console.log('path: %s cost time is ', ctx.path, Date.now() - now);	
});	
app.use(async ctx => {	
  const ipInfo = await axios.get('http://ip.taobao.com/service/getIpInfo.php?ip=0.0.0.0');	
  ctx.body = ipInfo.data;	
});	
	
http.createServer(app.callback()).listen(3000, ()=>{	
  console.log('http server start!')	
});	
	
let options = {	
  key: fs.readFileSync(__dirname+'/ssl/server.key'),	
  cert: fs.readFileSync(__dirname+'/ssl/server.crt')	
};	
https.createServer(options, app.callback()).listen(443, ()=>{	
  console.log('https server start!')	
});

备注:上面的server.keyserver.crt都是为了测试使用,大家需要去申请腾讯云或阿里云申请可用证书使用。


④ 测试示例:

http服务:

640?wx_fmt=png

https服务:(没有有效证书情况下,需在浏览器勾选忽略安全问题)

640?wx_fmt=png

有兴趣的同学强烈建议把代码拷贝到本地后自己调试观察。有需要同学可以在这里看以前写的一个koa的使用demo:https://github.com/FantasyGao/koa2。


如上内容均为自己总结,难免会有错误或者认识偏差,如有问题,希望大家留言指正,以免误人,若有什么问题请留言,会尽力回答之。如果对你有帮助不要忘了分享给你的朋友或者点击右下方的“在看”哦!也可以关注作者,查看历史文章并且关注最新动态,助你早日成为一名全栈工程师!

640?wx_fmt=png

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值