本篇我们讲一下 Koa2 框架的基本使用,希望能帮助大家快速上手

Koa2 是什么?简单来讲,它是一个基于 Node.js 的 web server 框架。

  • 官方文档

Koa2框架使用入门

不使用脚手架,直接使用Koa框架:

# 新建文件夹,控制台进入文件夹
npm init
npm install koa

然后就可以新建js文件写Koa代码了。带有详细注释的示例代码如下。

const Koa = require('koa')
const app = new Koa()// ctx: context, 上下文
app.use((ctx) => {ctx.body = 'hello koa!' // ctx.body即为HTTP响应返回的数据(即响应体中携带的数据)
})app.listen(3000) // 监听3000端口// 浏览器地址栏输入 http://localhost:3000/

使用脚手架koa-generator创建Koa项目:

# 安装脚手架
npm install koa-generator -g# 查看是否安装成功
koa2 --version
# 或 koa --version# 在当前路径下的指定文件夹创建koa项目(如果指定文件夹不存在则会创建)
koa2 <directory name> # 比如 koa2 demo
# 或者 koa <directory name>,如果使用 koa <directory name> 则创建的是koa1的项目# 进入以上指定的文件夹,执行 npm install
cd <directory name>
npm install# 开发环境下启动项目
npm run dev# 浏览器访问,地址栏输入如下url(默认端口号3000)
http://localhost:3000/

Koa2入门示例:新建路由、处理HTTP请求。带有详细注释的示例代码如下。

  • 在routes文件夹下新建文件demo.js如下
// /routes/demo.jsconst router = require('koa-router')()router.prefix('/demo') // 路径前缀router.get('/', function (ctx) { // ctx即context,是req(request)和res(response)的集合const query = ctx.query // 获取url中的参数(以对象的形式表示)console.log('query: ', query); // query: { xxx: 'xxx', ... }ctx.body = 'this is get demo' // 返回数据
})router.post('/', function (ctx) {const requestBody = ctx.request.body // 获取请求体中的数据console.log('request body: ', requestBody);// Koa会根据返回的数据的格式自动设置content-type// ctx.body = 'this is post demo' // 自动设置为text/plainctx.body = { errno: 0, message: 'this is post demo' } // 自动设置为application/json
})module.exports = router
  • 在app.js文件下引入路由并且注册路由
// /app.js// 引入路由
const demo = require('./routes/demo')// 注册路由
app.use(demo.routes(), demo.allowedMethods())
  • Postman发送POST请求


中间件与洋葱圈模型

中间件: 是指在整体流程上的一个独立的业务模块,其特点是可扩展、可插拔,就类似于工厂流水线中的一道工序。

使用中间件的意义:

  • 有助于将业务进行模块化拆分,让代码易写易读且便于维护;
  • 统一使用中间件,有助于各业务代码的规范化与标准化;
  • 易添加、易删除、易扩展。

对于Koa2框架来讲:

  • 所有的app.use(...)都是中间件;
  • 中间件的回调函数不会在服务启动后立即执行,而是只有当收到网络请求后才会按照顺序执行;
  • 路由也是中间件的一种,当收到网络请求后会根据请求的methodurl进行匹配,执行对应路由的回调函数。

Koa2中间件的回调函数通常具有如下形式:

async (ctx, next) => {// ctx即context,是req(request)和res(response)的集合// 执行next()即相当于调用下一个中间件的回调函数// 为了让代码按照预期顺序执行,通常使用 await next() 的方式进行使用
}

Koa2框架的中间件的执行机制,即为洋葱圈模型:

区分中间件与洋葱圈模型: 中间件是Koa2框架中的业务模块划分,洋葱圈模型是中间件的执行机制(执行顺序)。

洋葱圈模型演示:

// 洋葱圈模型示例代码const Koa = require('koa')
const app = new Koa()app.use(async (ctx, next) => {console.log('1 start')await next()console.log('1 end')
})
app.use(async (ctx, next) => {console.log('2 start')await next()console.log('2 end')
})
app.use(async (ctx, next) => {console.log('3 start')ctx.body = 'hello world'console.log('3 end')
})app.listen(3000)
console.log('server is running')// 启动服务时,控制台打印:
// server is running
// 浏览器访问 http://localhost:3000/ 后,控制台打印:
// 1 start
// 2 start
// 3 start
// 3 end
// 2 end
// 1 end

若某一中间件中不调用next(),则其后的所有中间件都不会执行。

// 某一中间件不调用next()const Koa = require('koa')
const app = new Koa()app.use((ctx, next) => {console.log('1 start')next()console.log('1 end')
})
app.use(async (ctx, next) => {console.log('2 start')// await next()console.log('2 end')
})
app.use(async (ctx, next) => {console.log('3 start')ctx.body = 'hello world'console.log('3 end')
})app.listen(3000)
console.log('server is running')// 启动服务时,控制台打印:
// server is running
// 浏览器访问 http://localhost:3000/ 后,控制台打印:
// 1 start
// 2 start
// 2 end
// 1 end  // 且浏览器不会显示 hello world

中间件回调函数使用async定义,且next()前加await的意义在于如果后面的中间件中有异步操作(比如Promise),则能保证代码按照期望的顺序执行。

不加async/await示例代码及运行结果:

// 不加async/awaitconst Koa = require('koa')
const app = new Koa()app.use((ctx, next) => {console.log('1 start')next()console.log('1 end')
})app.use(() => {console.log('2 start')new Promise((resolve, reject) => {setTimeout(() => { resolve('hello') }, 0)}).then((data) => { console.log(data) }).then((data) => { console.log(data) })console.log('2 end');
})app.listen(3000)// 浏览器访问 http://localhost:3000/ 后,控制台打印:
// 1 start
// 2 start
// 2 end
// 1 end
// hello
// undefined

async/await示例代码及运行结果:

const Koa = require('koa')
const app = new Koa()app.use(async (ctx, next) => {console.log('1 start')await next()console.log('1 end')
})app.use(async () => {console.log('2 start')await new Promise((resolve, reject) => {setTimeout(() => { resolve('hello') }, 0)}).then((data) => { console.log(data) }).then((data) => { console.log(data) })console.log('2 end');
})app.listen(3000)// 浏览器访问 http://localhost:3000/ 后,控制台打印:
// 1 start
// 2 start
// hello
// undefined
// 2 end
// 1 end

至此,Koa2的入门使用就介绍完了,希望对大家有所帮助~

如有疏漏之处欢迎评论区留言指正哦~

Koa2框架快速入门与基本使用相关推荐

  1. Quartz 框架快速入门(二)

    尽可能的用声明式处理软件配置,其次才考虑编程式的方式.在上一篇<Quartz 框架快速入门(一)>中,如果我们要在 Job 启动之后改变它的执行时间和频度,必须去修改源代码重新编译.这种方 ...

  2. Quartz 框架快速入门(四)

    Spring的scheduling.quartz包中对Quartz框架进行了封装,使得开发时不用写任何QuartSpring的代码就可以实现定时任务.Spring通过JobDetailBean,Met ...

  3. Quartz 框架快速入门(三)

    在前面两篇文章中简单介绍了在java应用程序中如何使用Quartz框架,这一篇中我们将看到如何在web环境下通过配置文件来完成Quartz的后台作业调度,而不必手工去创建Trigger和Schedul ...

  4. 【完结】给新手的12大深度学习开源框架快速入门项目

    文/编辑 | 言有三 这是一篇总结文,给大家来捋清楚12大深度学习开源框架的快速入门,这是有三AI的GitHub项目,欢迎大家star/fork. https://github.com/longpen ...

  5. java day53【 Mybatis框架概述 、 Mybatis 框架快速入门、自定义 Mybatis 框架 】

    第1章 框架概述 1.1 什么是框架 1.1.1 什么是框架 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种 定义认为,框架是可被应用开发者定 ...

  6. 微信小程序wepy框架快速入门

    微信小程序wepy框架快速入门 微信小程序简介 微信小程序,简称小程序,英文名Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用"触手可及"的梦想,用户扫一 ...

  7. Python学习笔记--10.Django框架快速入门之后台管理admin(书籍管理系统)

    Python学习笔记--10.Django框架快速入门之后台管理 一.Django框架介绍 二.创建第一个Django项目 三.应用的创建和使用 四.项目的数据库模型 ORM对象关系映射 sqlite ...

  8. MyBatis框架快速入门

    MyBatis框架快速入门 入门案例 创建一个关于Mybatis项目 首先创建一个空项目,然后新建一个moudle,选择quickstart,接下来把模块放到空项目之下.即可 实现mybatis查询数 ...

  9. Go语言Web框架:Beego框架快速入门

    文章目录 Beego框架快速入门 1.beego框架了解 2.MVC架构 3.环境搭建 4.beego的项目结构分析 5.Beego快速体验 6.Beego运行流程分析 7.Post案例实现 7.1前 ...

最新文章

  1. 如何挑选深度学习 GPU?
  2. 这次,让我们捋清:同步、异步、阻塞、非阻塞
  3. 在小公司、中等规模公司和大公司工作有什么不同
  4. linux mysql 5.5 安装_Linux 安装 mysql5.5.19
  5. Introspection in Python How to spy on your Python objects Guide to Python introspection
  6. ArcGIS实验教程——实验三十七:基于ArcGIS的太阳辐射分析案例教程
  7. Leetcode周赛复盘——第 71 场力扣双周赛与第 279 场力扣周赛
  8. 牛客网 【每日一题】8月5日题目精讲—蓝魔法师
  9. python爬虫爬取音乐单曲_Python爬取qq音乐的过程实例
  10. php 不同数据库的调用方法,php连接不同数据库的几种方法
  11. .Net 程序员应该知道的工具和网站
  12. android调节屏幕亮度
  13. ef codefirst字段类型与sqlserver表字段类型对应概要
  14. python中quadratic,Python: Using CVXOPT for quadratic programming
  15. 第十二章:email-mailbox:管理email归档-imaplib:IMAP4客户库-变种
  16. 执行ansible报CryptographyDeprecationWarning
  17. API电商平台获取淘宝商品详情
  18. TDK 小型冗余模拟 TMR 角度传感器。
  19. AI Earth ——开发者模式案例8:利用Landsat-8数据进行地表温度反演
  20. lwip组播实现和原理-STM32F407

热门文章

  1. 电商婴幼儿产品数据分析
  2. 白话微服务60秒:吴站长汉奸名册就是注册与发现!
  3. 注册表入门1【ie浏览器的设置】
  4. 抖音点赞最多的标题_抖音标题怎么写吸引人点赞多(5个细节需要注意)
  5. 如何使用Qt实现腾讯云实时音视频功能?
  6. winpython,安装与使用(anaconda)
  7. 解决 ‘无法启动承载网络 组或资源的状态不是执行请求操作的正确状态’
  8. Windows Terminal 配置文件+图形化配置界面+右键菜单+管理员权限
  9. java expires_Expires和max-age的区别
  10. python住你微信跳一跳拿高分