一起来探索Koa的奥秘

To explore Koa

上篇我们介绍了Koa2这个框架以及基础的服务搭建,接下来学习Koa2的中间件以及路由。Koa2在介绍中也提到了,它不内置中间件,但是提供中间件内核。中间件是Koa2的核心。

Koa中间件

中间件是什么?

koa2的中间件是通过 async await 实现的,中间件执行顺序是“洋葱圈”模型。

中间件之间通过next函数联系,当一个中间件调用 next() 后,会将控制权交给下一个中间件, 直到下一个中间件不再执行 next() 后, 将会沿路折返,将控制权依次交换给前一个中间件。

// 洋葱模型特点
// 引入 Koa
const Koa = require("koa");// 创建服务
const app = new Koa();app.use(async (ctx, next) => {console.log(1);await next();console.log(2);
});app.use(async (ctx, next) => {console.log(3);await next();console.log(4);
});app.use(async (ctx, next) => {console.log(5);await next();console.log(6);
});// 监听服务
app.listen(3000, () => {console.log('starting at port 3000')
})// 执行结果
// 1
// 3
// 5
// 6
// 4
// 2

Koa路由

路由是什么?

路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP 方法(GET、POST 等)组成的,涉及到应用如何响应客户端对某个网站节点的访问。路由就是根据不同的URL地址,加载不同的页面实现不同的功能。PS:一般正常开发中,我们使用 koa-router 第三方中间件来开发,也可以自己封装路由中间件,也比较容易,但是重复造轮子是大忌,懂得原理即可

koa-router基本使用

前面介绍了中间件,在这我们使用koa-router中间件,首先在项目中安装koa-router

npm install --save koa-router

koa-router的使用

const Koa = require('koa')
const app = new Koa()
const Router = require('koa-router')
​
// 路由1
let home = new Router()
home.get('/', async ( ctx )=>{ctx.body = "路由1"
})
​
// 路由2
let page = new Router()
page.get('/404', async ( ctx )=>{ctx.body = '路由2 --> 404 page!'
}).get('/hello', async ( ctx )=>{ctx.body = '路由2 --> helloworld page!'
})
​
// 装载所有子路由
let router = new Router()
router.use('/', home.routes(), home.allowedMethods())
router.use('/page', page.routes(), page.allowedMethods())
​
// 加载路由中间件
app.use(router.routes()).use(router.allowedMethods())
​
app.listen(3000, () => {console.log('starting at port 3000')
})

node app.js运行

http://localhost:3000/页面会输出

http://localhost:3000/page/404页面会输出

http://localhost:3000/page/hello页面会输出

上面的代码分了2个路由模块,home路由模块和 page 路由模块,通过 2次 new Router() 实例化实现,再实例化一个总的路由集合router将所有子路由集合,最后通app.use(router.routes()).use(router.allowedMethods())  方法将 路由集合router注册在整个服务程序中

koa路由get传值

在koa2中GET传值通过request接收,但是接收的方法有两种:query和querystring。

query:返回的是格式化好的参数对象。
querystring:返回的是请求字符串。

const Koa = require('koa')
const app = new Koa()
const Router = require('koa-router')
​
let router = new Router()
router.get('/', function (ctx, next) {ctx.body = "Hello World";
})
router.get('/getParam', async (ctx) => {let url = ctx.url;//从request中获取GET请求let request = ctx.request;let req_query = request.query;let req_querystring = request.querystring;//从上下文中直接获取let ctx_query = ctx.query;let ctx_querystring = ctx.querystring;ctx.body = {url, // "getparam?id=123"req_query, // {"123":"123"}req_querystring, // "id=123"ctx_query, // {"id":123}}ctx_querystring // "id=123"}// {// "url":"/getParam?id=123",// "req_query":{"id":"123"},// "req_querystring":"id=123",// "ctx_query":{"id":"123"},// "ctx_querystring":"id=123"// }})
​
// 加载路由中间件
app.use(router.routes()).use(router.allowedMethods())
app.listen(3000, () => {console.log('starting at port 3000')
})

koa动态路由

ctx.params:获取动态路由传参

const Koa = require('koa')
const app = new Koa()
const Router = require('koa-router')
​
let router = new Router()
router.get('/', function (ctx, next) {ctx.body = "Hello World";
})
router.get('/getParam/:id', async (ctx) => {//ctx.params获取动态路由传参console.log(ctx.params) // {"id":"123"}ctx.body= ctx.params;
})
​
// 加载路由中间件
app.use(router.routes()).use(router.allowedMethods())
​
app.listen(3000, () => {console.log('starting at port 3000')
})
 

—— 敬请期待 ——

公众号 : 码个球

初识koa2-中间件及路由相关推荐

  1. Node 学习 | Day03 express (初识Express、Express 路由、Express 中间件、使用 Express 写接口)

    Express 初识Express 1.1 Express 简介 1.1.1 什么是 express 1.1.2 进一步理解 Express 1.1.3 Express可以做什么 1.2 Expres ...

  2. express中间件和路由教程

    一.路由 1.通常HTTP URL的格式是这样的:http://host[:port][path] http表示协议. host表示主机. port为端口,可选字段,不提供时默认为80. path指定 ...

  3. koa2 中间件里面的next到底是什么

    koa2短小精悍,女人不爱男人爱. 之前一只有用koa写一点小程序,自认为还吼吼哈,知道有一天某人问我,你说一下 koa或者express中间件的实现原理.然后我就支支吾吾,好久吃饭都不香. 那么了解 ...

  4. Express 中间件及路由

    通过示例介绍中间件 打印请求日志(输出每个请求的 请求方法 + 请求路径 + 请求时间) app.get('/', (req, res) => {res.send('get /') })app. ...

  5. Gin 框架学习笔记(01)— 自定义结构体绑定表单、绑定URI、自定义log、自定义中间件、路由组、解析查询字符串、上传文件、使用HTTP方法

    要实现一个 API 服务器,首先要考虑两个方面:API 风格和媒体类型.Go 语言中常用的 API 风格是 RPC 和 REST,常用的媒体类型是 JSON.XML 和 Protobuf.在 Go A ...

  6. 关于koa2中间件的运行演示

    关于koa2中间件的运行演示 看演示代码: const Koa = require('koa'); const app = new Koa();app.use(async (ctx, next) =& ...

  7. 【gin学习笔记】05 gin的中间件和路由分组

    本文学习视频https://www.bilibili.com/video/BV18C4y1p7Fe/?spm_id_from=333.788 什么是路由分组 对router创建group就是分组,同一 ...

  8. 【Node.js实战】一文带你开发博客项目之初识Koa2(koa2安装使用、搭建开发环境、测试路由)

    个人简介

  9. Laravel 5 中间件、路由群组、子域名路由、 权限控制的基本使用方法

    创建控制器: php artisan make:controller Admin/IndexController 创建Middleware: php artisan make:middleware T ...

  10. Express接口综合案例(创建项目、配置常用中间件、路由设计、提取控制器模块、配置错误统一处理中间件、用户注册的数据验证,密码加密)

    一.创建项目 二.目录结构 三.配置常用中间件 3.1 解析请求体 express.json() express.urlencoded() 3.2 日志输出 morgan() 3.3 为客户端提供跨域 ...

最新文章

  1. P1514 引水入城
  2. 【转】深入探讨 Android 传感器
  3. 牛客竞赛36签到题A(思维)
  4. MySQL--SQL中的安全问题
  5. 6.824 MapReduce lab1 2020(一)
  6. python中set index_python中set基础应用
  7. Go 开发 HTTP 的另一个选择 fasthttp
  8. 如何使用 AirPlay 在 Mac 上使用 HomePod?
  9. 我的权限系统设计实现MVC4 + WebAPI + EasyUI + Knockout(二)菜单导航
  10. 微pe工具箱有linux版吗,微PE工具箱
  11. vb连接mysql数据库报错_vb6连接mysql数据库
  12. 韩立刚计算机网络——第三章:数据链路层
  13. Unity3D游戏高性能战争迷雾系统实现
  14. android linux 双系统实现(android+buster)同时运行
  15. CSP介绍、以及使用CryptoAPI枚举CSP并获取其属性
  16. 用C语言恶搞你的好朋友strcmp()
  17. HC32_HC32F072FAUA_从零开始搭建空工程模板
  18. win10系统 如何设置定时开关机?
  19. cobra是什么鬼?
  20. SysML图例-核聚变

热门文章

  1. 完美运营修复版Thinkphp仿素材火整站源码,虚拟产品购买系统加会员系统
  2. com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `
  3. Mac pro配置minIo客户端
  4. vue如何写静态页面
  5. 谷牛期权长期投资策略的实践与思考
  6. 数学建模常考三大模型
  7. 服务器E盘找不到,Windows03系统D盘不见怎么办
  8. 计算机睡眠状态单机游戏,睡眠小镇电脑版
  9. python用tkinter实现qq_Python+Tkinter 密保小工具-阿里云开发者社区
  10. 48个音标,你学会了吗?