Koa2 入门实践

2023-12-18 18:32
文章标签 实践 入门 koa2

本文主要是介绍Koa2 入门实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第一个例子:启动

初始化项目,安装环境

# -y 就是不想自己逐条配置,直接全部使用默认配置
npm init -y# 安装 koa 并写入 package.json 中
npm i koa --save# 好的代码规范还是必要的
npm i standard --save-dev# 安装 nodemon 用于开发环境快速自动重启
npm i -g nodemon

配置开发选项

这个时候我们就可以用到 npm script 了,避免重复输入命令

# package.json 中的 scripts 中添加# 正常启动服务
"start": "node index.js",
# 启动开发环境,保存修改内容后自动重启
"dev": "NODE_ENV=develpment nodemon index.js"
  • 编写 index.js

这个时候我们新建一个文件叫 index.js 并编辑它

// index.js// 引入 koa
const Koa = require('koa')// 新建 koa 实例
const app = new Koa()app.use(async (ctx) => { ctx.body = JSON.stringify(ctx) })// 监听 5820 端口,服务启动成功输出内容
app.listen(5820, () => { console.log('APP LISTEN PORT 5820') })

然后我们在项目下打开终端,输入 npm run dev 就可以启动服务的开发模式了,这个时候可以看到控制台输出了 APP LISTEN PORT 5820,同时我们打开浏览器并访问 localhost:5820 ,就可以看到当前访问的上下文信息了

这是最简单的例子,同时也是最重要的,标志了你已可以正式启动 Koa 服务了

GET 请求的参数接收

写一个最简单的例子

// 引入 koa
const Koa = require('koa')// 新建 koa 实例
const app = new Koa()app.use(async (ctx) => {ctx.body = {url: ctx.url,params: ctx.request.query,param_string: ctx.request.querystring,ctx_params: ctx.query,ctx_params_string: ctx.querystring}
})// 监听 5820 端口,服务启动成功输出内容
app.listen(5820, () => { console.log('APP LISTEN PORT 5820') })

这个时候,我们在浏览器提交一个请求,使用get访问 localhost:5820?hello=world&pika=qiu

这个时候我们就可以查看内容了

从这里可以看出

获取在 koa 中 GET 的参数方式有两种:query和querystring。同时我们可以看出,在可以从 request 中接收 GET 请求和直接从上下文中接收 GET 请求都是可以的。

  • query:返回的是的参数对象。
  • querystring:返回的是请求字符串。

POST 请求的参数接收

koa 并不带 POST 请求的解析,这个时候,我们就要自己编写 POST 请求的解析函数了

function parseParams (ctx) {return new Promise((resolve, reject) => {try {let paramsdata = ''ctx.req.on('data', (data) => {paramsdata += data})ctx.req.addListener('end', function () {resolve(parseQueryStr(paramsdata))})} catch (error) {reject(error)}})
}function parseQueryStr (queryStr) {let queryData = {}let queryStrList = queryStr.split('&')for (let [index, queryStr] of queryStrList.entries()) {let itemList = queryStr.split('=')queryData[itemList[0]] = decodeURIComponent(itemList[1])}return queryData
}

使用的时候就可以这么使用

app.use(async (ctx) => {let params = await parseParams(ctx)ctx.body = {method: ctx.method,url: ctx.url,params}
})

这个时候,我们可以使用 POSTMAN 来模拟一下 POST 请求的发送,我们可以发现参数已经被成功解析了

koa-bodyparser 中间件

当然 POST 请求这么常见的需求是一定有造好的轮子的,这个时候我们就可以使用 koa-bodyparser 来进行参数的解析了

安装依赖

npm i koa-bodyparser --save
  • 引入并使用
// 引入 koa
const Koa = require('koa')
// 引入 koa-bodyparser
const KoaBodyparser = require('koa-bodyparser')
// 新建 koa 实例
const app = new Koa()// 使用中间件
app.use(KoaBodyparser())app.use(async (ctx) => {ctx.body = {method: ctx.method,url: ctx.url,params: ctx.request.body}
})// 监听 5820 端口,服务启动成功输出内容
app.listen(5820, () => { console.log('APP LISTEN PORT 5820') })

然后我们使用 POSTMAN 模拟一下请求就可以看出,这里我们直接使用 ctx.request.body 就可以取到格式化后的参数对象了

koa 原生路由

先编写一个简单的中间件

// 因为使用了 fs 模块,所以我们要引入
const fs = require('fs')// 先写好对应的文件,然后写一个读取文件内容的函数
function readfile (params) {return new Promise((resolve, reject) => {fs.readFile(`./route/${params}.html`, 'binary', (err, data) => {if (err) {reject(err)} else {resolve(data)}})})
}
// 再编写路由配置
async function route (url) {let page = ''switch (url) {case '/index':page = 'index'breakcase '/page':page = 'page'breakcase '/user':page = 'user'breakdefault: page = '/404'break}let html = await readfile(page)return html
}
// 就可以这么使用了
app.use(async (ctx) => {let html = await route(ctx.url)ctx.body = html
})

koa-router中间件

当然,常用的东西肯定是有中间件的,这个时候我们就可以祭出 koa-router

安装 koa-router

npm i koa-router --save
  • 基础案例
// 引入 koa
const Koa = require('koa')
// 引入 koa-router
const KoaRouter = require('koa-router')
// 实例化一个 koa 对象
const app = new Koa()
// 实例化一个 router 对象
let route = new KoaRouter()// 表示接收 get 请求,接收 url 为 /
// 其中 next 指的是下一个中间件,可以在代码中使用 await next() 来提前执行
route.get('/', (ctx, next) => {ctx.body = 'Hello get'
})// 表示接收 post 请求
route.post('/test', (ctx, next) => {ctx.body = 'hello post'
})// 表示接收全部请求
route.all('/all', (ctx, next) => {ctx.body = 'hello all'
})// 装载路由,并只允许指定方法访问
app.use(route.routes()).use(route.allowedMethods())// 监听 5820 端口,服务启动成功输出内容
app.listen(5820, () => { console.log('APP LISTEN PORT 5820') })

层级案例

当然,日常工作中的路由不可能这么简单,这个时候我们就需要使用多层次的路由的,下面看案例

先简单创建一下目录并路由文件


mkdir route
touch route1.js route2.js
// route1.js
let KoaRouter = require('koa-router')let route = new KoaRouter()route.get('/test1', (ctx, next) => {ctx.body = 'route1 test1'
})route.get('/test2', (ctx, next) => {ctx.body = 'route1 test2'
})route.get('/test3', (ctx, next) => {ctx.body = 'route1 test3'
})module.exports = route
// route2.js
let KoaRouter = require('koa-router')let route = new KoaRouter()route.get('/test1', (ctx, next) => {ctx.body = 'route2 test1'
})route.get('/test2', (ctx, next) => {ctx.body = 'route2 test2'
})route.get('/test3', (ctx, next) => {ctx.body = 'route2 test3'
})module.exports = route
// 根目录下的 server.js
// 引入 koa,路由
const Koa = require('koa')
let KoaRouter = require('koa-router')
// 实例化一个 koa 对象
const app = new Koa()
// 创建一个全局的父路由,子路由要全部挂载在父路由下
let fatherRoute = new KoaRouter()
// 引入子路由
const route1 = require('./route/route1')
const route2 = require('./route/route2')// 装载路由,并只允许指定方法访问
fatherRoute.use('/route1', route1.routes(), route1.allowedMethods())
fatherRoute.use('/route2', route2.routes(), route2.allowedMethods())// Koa 装载父路由
app.use(fatherRoute.routes()).use(fatherRoute.allowedMethods())// 监听 5820 端口,服务启动成功输出内容
app.listen(5820, () => { console.log('APP LISTEN PORT 5820') })
  • 这个时候我们就可以启动,然后访问 localhost:5820/route1/test1

localhost:5820/route2/test3 来查看一下效果

koa 中使用cookie

最简单的 key-value 形式设置与获取

// 引入 koa
const Koa = require('koa')
// 引入 koa-router
const KoaRouter = require('koa-router')
// 实例化一个 koa 对象
const app = new Koa()
// 实例化一个 router 对象
let route = new KoaRouter()// 最简单的 key-value 形式,可以直接使用上下文对象提供的 cookie 对象进行操作
route.get('/', (ctx, next) => {ctx.cookies.set('TESTCOOKIE', 'LOVEWZJ'.repeat(5))ctx.body = 'SET COOKIE OK'
})// 获取 cookie
route.get('/test', (ctx, next) => {ctx.body = `GET COOKIE IS ${ctx.cookies.get('TESTCOOKIE')}`
})// 装载路由,并只允许指定方法访问
app.use(route.routes()).use(route.allowedMethods())// 监听 5820 端口,服务启动成功输出内容
app.listen(5820, () => { console.log('APP LISTEN PORT 5820') })
// 复杂的 key-value-options 形式
route.get('/', (ctx, next) => {ctx.cookies.set('TESTCOOKIE', 'LOVEWZJ', {maxAge: 1000 * 60 * 60 * 24,expires: new Date('2018-12-31')})ctx.body = `SET COOKIE OK ${new Date().toLocaleTimeString()}`
})
  • 配置项
名称含义示例
pathcookie 的路径默认 /
domaincookie 的域*.baidu.com
expirescookie 有效期时间new Date(‘2018-12-31’)
maxAgecookie 最大存活时间1000 * 60 * 60 * 24
httpOnly是否只能通过 HTTP 协议发送true|false
signed是否要做签名true|false
secure通过什么协议发送 cookiefalse 表示 cookie 通过 HTTP 协议发送,true 表示 cookie 通过 HTTPS 发送
overwirte是否允许重写true|false

koa-static 中间件

对于一些静态的资源,比如图片,CSS文件,JS文件,HTML文件等资源,我们可以直接使用 koa-static 中间件进行处理。

安装依赖

npm i kao-static --save
  •  

应用

注意:这里是把所有的静态资源放在 static 目录下

// 引入 koa
const Koa = require('koa')
// 引入 path 模块
const path = require('path')
// 引入 koa-static 中间件
const KoaStatic = require('koa-static')// 实例化一个 koa 对象
const app = new Koa()// 装载静态资源中间件
app.use(KoaStatic(path.join(__dirname, './static')
))// 监听 5820 端口,服务启动成功输出内容
app.listen(5820, () => { console.log('APP LISTEN PORT 5820') })

koa 中间件

app.use() 的功能实际上就是把里面的函数加入到回调函数执行列表中,下面我们写一个简单的例子来看一下

// 引入 koa
const Koa = require('koa')// 实例化一个 koa
const app = new Koa()
app.use(log)app.use(async (ctx) => { ctx.body = ctx.url })// 我们写的异步程序
async function log (ctx, next) {ctx.url = 'I CAN CHANGE CTX URL'await next()
}// 监听 5820 端口,服务启动成功输出内容
app.listen(5820, () => { console.log('APP LISTEN PORT 5820') })

转载https://blog.csdn.net/qq_17347575/article/details/79601333

这篇关于Koa2 入门实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/509382

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非