百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

NodeJS,Koa,Web框架,洋葱模型,路由、GET和POST,案例代码

ccwgpt 2024-09-21 13:36 28 浏览 0 评论

Koa——新的web框架

Koa是一个新的web框架,由Express幕后的原班人马打造,致力于成为web应用和API开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用async函数,Koa丢弃回调函数,并有力地增强错误处理。Koa并没有捆绑任何中间件,而是提供了一套优雅的方法。

官网:https://koajs.com/,GitHub 仓库:https://github.com/koajs/koa,翻译的中文网:https://koa.bootcss.com/,基于Node.js平台新的web框架,是下一代web开发框架

Koa使用洋葱模型

洋葱模型,一层包裹一层,nodejs框架的执行就像是中间穿过洋葱的一条线,而每一层洋葱皮就代表一个中间件,进入时穿过多少层,出来时还得穿出多少层,具有先进后出(栈)的特点。

koa洋葱圈模型:1、中间件机制,是koa2的精髓;2、每个中间件都是async函数;3、中间件的运行机制,就像洋葱圈。

Koa的上下文(Context)

Koa Context,node的request和response对象封装到单个对象中,为编写Web应用程序和API提供了许多有用的方法,这些操作在HTTP服务器开发中频繁使用,被添加到此级别而不是更高级别的框架,这将强制中间件重新实现这些通用功能。

Koa框架路由

const router = require('koa-router')();,require("koa-router") 返回的是函数,执行之后返回对象。

案例代码

安装命令

npm init -y
npm install koa --save
npm install koa-router --save
npm install koa-bodyparser --save-dev 

使用版本:

{
  "name": "koa01",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node app.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "koa": "^2.13.4",
    "koa-router": "^10.1.1"
  },
  "devDependencies": {
    "koa-bodyparser": "^4.3.0"
  }
}

案例一:

const Koa = require('koa');
const app = new Koa();

// 日志
app.use(async (ctx, next) => {
  await next();
  const rt = ctx.response.get('X-Response-Time');
  console.log(`${ctx.method} ${ctx.url} - ${rt}`);
});

// x-response-time
app.use(async (ctx, next) => {
  const start = Date.now();
  await next();
  const ms = Date.now() - start;
  ctx.set('X-Response-Time', `${ms}ms`);
});

// 响应(访问所有地址,处理相同)
app.use(async ctx => {
  ctx.body = 'Hello World';
});

app.listen(3000);
console.log('app started at port 3000...');

案例二,执行顺序:

const Koa = require('koa');
const app = new Koa();

// x-response-time
app.use(function* (next) {
  // (1) 进入路由
  console.log(1, "进入路由");
  const start = new Date;
  yield next;
  // (5) 再次进入 x-response-time 中间件,记录2次通过此中间件「穿越」的时间
  console.log(5, "再次进入 x-response-time 中间件");
  const ms = new Date - start;
  this.set('X-Response-Time', ms + 'ms');
  // (6) 返回 this.body
  console.log(6, "返回 this.body");
});

// logger
app.use(function* (next) {
  // (2) 进入 logger 中间件
  console.log(2, "进入 logger 中间件");
  const start = new Date;
  yield next;
  // (4) 再次进入 logger 中间件,记录2次通过此中间件「穿越」的时间
  console.log(4, "再次进入 logger 中间件");
  const ms = new Date - start;
  console.log('%s %s - %s', this.method, this.url, ms);
});

// response
app.use(function* () {
  // (3) 进入 response 中间件,没有捕获到下一个符合条件的中间件,传递到 upstream
  console.log(3, "进入 response 中间件");
  this.body = 'Hello World~';
});

app.listen(3000);

案例三,路由及GET、POST:

const BodyParser = require('koa-bodyparser');

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

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


app.use(async (ctx, next) => {
  console.log(`Process 请求方式:${ctx.request.method},请求URL:${ctx.request.url}...`);
  await next();
});

// middleware的顺序
app.use(bodyparser);

// x-response-time
app.use(async (ctx, next) => {
  const start = Date.now();
  await next();
  const ms = Date.now() - start;
  ctx.set('X-Response-Time', `${ms}ms`);
  ctx.response.body = ctx.response.body + "<p>" + ms + "ms</p>";
});

// http://127.0.0.1:3000/main/%E4%BD%A0%E5%A5%BD
router.get('/main/:name', async (ctx, next) => {
  let name = ctx.params.name;
  ctx.response.body = `<h1>main, ${name}!</h1>`;
});

// http://127.0.0.1:3000/user?id=100001&name=李四
// koa-router url get传值
router.get("/user", async (ctx, next) => {
  //get传值
  console.log(ctx.request.query);
  ctx.response.body = "获取get传值=>" + JSON.stringify(ctx.request.query);
});

// http://127.0.0.1:3000/regest
//get路由
router.get("/regest", async (ctx, next) => {
  ctx.response.body = `
  <form action='/regest' method='post'>
      <input type='text' name='id'/>
      <button>注册</button>
  </form>
  `;
});

// post
router.post('/regest', async (ctx, next) => {
  console.log(ctx.request.body);
  ctx.response.body = "注册成功=>" + JSON.stringify(ctx.request.body);
})

// http://127.0.0.1:3000/
router.get('/', async (ctx, next) => {
  ctx.response.body = '<h1>我是首页!</h1>';
});

app.use(router.routes());
app.listen(3000);
console.log('app started at port 3000...');

相关推荐

迈向群体智能 | 智源发布首个跨本体具身大小脑协作框架

允中发自凹非寺量子位|公众号QbitAI3月29日,智源研究院在2025中关村论坛“未来人工智能先锋论坛”上发布首个跨本体具身大小脑协作框架RoboOS与开源具身大脑RoboBrain,可实...

大模型对接微信个人号,极空间部署AstrBot机器人,万事不求百度

「亲爱的粉丝朋友们好啊!今天熊猫又来介绍好玩有趣的Docker项目了,喜欢的记得点个关注哦!」引言前两天熊猫发过一篇关于如何在极空间部署AstrBot并对接QQ消息平台的文章,不过其实QQ现在已经很少...

Seata,让分布式事务不再是难题!实战分享带你领略Seata的魅力!

终身学习、乐于分享、共同成长!前言Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式的...

常见分布式事务解决方案(分布式事务解决的问题)

1.两阶段提交(2PC)原理:分为准备阶段(协调者询问参与者是否可提交)和提交阶段(协调者根据参与者反馈决定提交或回滚)。优点:强一致性,适用于数据库层(如XA协议)。缺点:同步阻塞:所有参与者阻塞...

分布式事务:从崩溃到高可用,程序员必须掌握的实战方案!

“支付成功,但订单状态未更新!”、“库存扣减后,交易却回滚了!”——如果你在分布式系统中踩过这些“天坑”,这篇文章就是你的救命稻草!本文将手把手拆解分布式事务的核心痛点和6大主流解决方案,用代码实战+...

谈谈对分布式事务的一点理解和解决方案

分布式事务首先,做系统拆分的时候几乎都会遇到分布式事务的问题,一个仿真的案例如下:项目初期,由于用户体量不大,订单模块和钱包模块共库共应用(大war包时代),模块调用可以简化为本地事务操作,这样做只要...

一篇教你通过Seata解决分布式事务问题

1 Seata介绍Seata是由阿里中间件团队发起的开源分布式事务框架项目,依赖支持本地ACID事务的关系型数据库,可以高效并且对业务0侵入的方式解决微服务场景下面临的分布式事务问题,目前提供AT...

Seata分布式事务详解(原理流程及4种模式)

Seata分布式事务是SpringCloudAlibaba的核心组件,也是构建分布式的基石,下面我就全面来详解Seata@mikechen本篇已收于mikechen原创超30万字《阿里架构师进阶专题合...

分布式事务最终一致性解决方案有哪些?MQ、TCC、saga如何实现?

JTA方案适用于单体架构多数据源时实现分布式事务,但对于微服务间的分布式事务就无能为力了,我们需要使用其他的方案实现分布式事务。1、本地消息表本地消息表的核心思想是将分布式事务拆分成本地事务进行处理...

彻底掌握分布式事务2PC、3PC模型(分布式事务视频教程)

原文:https://mp.weixin.qq.com/s/_zhntxv07GEz9ktAKuj70Q作者:马龙台工作中使用最多的是本地事务,但是在对单一项目拆分为SOA、微服务之后,就会牵扯出分...

Seata分布式事务框架关于Annotation的SAGA模式分析

SAGAAnnotation是ApacheSeata版本2.3.0中引入的功能,它提供了一种使用Java注解而不是传统的JSON配置或编程API来实现SAGA事务模式的声明...

分布式事务,原理简单,写起来全是坑

今天我们就一起来看下另一种模式,XA模式!其实我觉得seata中的四种不同的分布式事务模式,学完AT、TCC以及XA就够了,Saga不好玩,而且长事务本身就有很多问题,也不推荐使用。S...

内存空间节约利器redis的bitmap(位图)应用场景有哪些你知道吗

在前面我们分享过一次Redis常用数据结构和使用场景,文章对Redis基本使用做了一个简单的API说明,但是对于其中String类型中的bitmap(位图)我们需要重点说明一下,因为他的作用真的不容忽...

分布式事务原理详解(图文全面总结)

分布式事务是非常核心的分布式系统,也是大厂经常考察对象,下面我就重点详解分布式事务及原理实现@mikechen本文作者:陈睿|mikechen文章来源:mikechen.cc分布式事务分布式事务指的是...

大家平时天天说的分布式系统到底是什么东西?

目录从单块系统说起团队越来越大,业务越来越复杂分布式出现:庞大系统分而治之分布式系统所带来的技术问题一句话总结:什么是分布式系统设计和开发经验补充说明:中间件系统及大数据系统前言现在有很多Java技术...

取消回复欢迎 发表评论: