简介

koa是基于node开发的一个服务端框架,功能同express,但更小巧简单。

官方仓库地址:https://github.com/koajs/koa

创建项目

创建文件夹nodeKoa,执行以下脚本

npm init -y
npm i koa
npm i nodemon

基础示例

创建一个服务器

命令行输入

nodemon app.js

打开浏览器,输入http:localhost:3000即可看到效果

路由

koa没有提供路由模块,我们可以借助其内置的ctx.path获取其请求路径,自己做出判断

//创建一个请求
app.use( ctx => {const path = ctx.pathif(path == "/"){ctx.body = "这是首页"}else if( path == "/foo"){ctx.body = "这是详情页"}else{ctx.body = "404"}
})

但是,这种方式还是比较麻烦的,我们使用它的官方route插件

官方地址:https://github.com/koajs/router

npm install @koa/router

基础示例


/*** 使用koa启动一个HTTP服务*/
const Koa = require("koa")const Router = require("@koa/router")
//创建实例
const app = new Koa()const router  = new Router()router.get("/",ctx => {ctx.body = '这是首页'
})//路由挂载
app.use(router.routes()).use(router.allowedMethods());app.listen(3000, () => {console.log("服务运行在:http:localhost:3000");
})

路由模块的写法和expresss几乎是一致的

静态资源托管

如果网站提供静态资源(图片、字体什么的),如果为他们单独写一个路由很麻烦也没有必要。koa-stati模块封装了这部分请求

官方文档:https://github.com/koajs/static

 安装

npm install koa-static

我们在根目录创建一个public文件夹,里面放一张图片,然后直接访问里面的内容

 可以发现,资源文件无法直接访问,我们创建一个静态资源目录

/*** 使用koa启动一个HTTP服务*/
const Koa = require("koa")
const Router = require("@koa/router")
//引入静态资源插件
const static = require("koa-static")//创建实例
const app = new Koa()
//建立静态托管目录
app.use(static("./public"))const router  = new Router()router.get("/",ctx => {ctx.body = '这是首页'
})//路由挂载
app.use(router.routes()).use(router.allowedMethods());app.listen(3000, () => {console.log("服务运行在:http:localhost:3000");
})

 核心代码

//引入静态资源插件
const static = require("koa-static")
//建立静态托管目录
app.use(static("./public"))

 这时,可以发现资源已经可以被正常访问了

我们目前的路径是相对路径,这是不安全的,我们应该使用绝对路径. 

const path = require('path')
//建立静态托管目录
app.use(static(path.join(__dirname,"./public")))

 虚拟路径

资源的目录或中间件可以设置成虚拟路径,需要使用官方的mount中间件

传送门: https://github.com/koajs/mount

 安装

npm install koa-mount

 使用

const mount = require('koa-mount')
//建立静态托管目录
app.use( mount('/public',static(path.join(__dirname,"./public"))))

 路由重定向

请求bar路径,重定向到boo

router.get('/bar',ctx => {//重定向针对的同步请求ctx.redirect('/boo')
)

 中间件

koa最大的特色,就是中间件.为了理解中间件.我们先看一下logger(日志功能)的实现

  • 先进后出
  • 最外层首先执行
  • 调用next,把执行权交给下一个中间件最内层的中间件最后执行

 logger功能

/*** 使用koa启动一个HTTP服务*/
const Koa = require("koa")//创建实例
const app = new Koa()const one = (ctx,next) => {console.log(">>> one");next()console.log("<<< one");
}const two = (ctx,next) => {console.log(">>> two");next()console.log("<<< two");
}const three = (ctx,next) => {console.log(">>> three");next()console.log("<<< three");
}app.use(one)
app.use(two)
app.use(three)app.listen(3000, () => {console.log("服务运行在:http:localhost:3000");
})

 输出结果

>>> one
>>> two
>>> three
<<< three
<<< two
<<< one

 异步中间件

/*** 使用koa启动一个HTTP服务*/
const Koa = require("koa")//创建实例
const app = new Koa()const fs = require('fs')const util = require("util")app.use( async (ctx ,next) => {const asyReadFile = util.promisify(fs.readFile)const data = await asyReadFile("./index.html","utf8")ctx.body = data
})app.listen(3000, () => {console.log("服务运行在:http//:localhost:3000");
})

 除了在回调函数里指定类型,我们也可以在ctx里直接指定返回的类型

app.use( async (ctx ,next) => {const asyReadFile = util.promisify(fs.readFile)const data = await asyReadFile("./index.html")ctx.type = "html"ctx.body = data
})

 Koa的中间件合并

当有多个中间件时,我们一个个进行挂载是非常低效的,我们可以使用中间件合并功能。

 传送门:https://github.com/koajs/compose

 安装

npm install koa-compose

示例

app.use = compose([a1, a2, a3, ...])

中间件异常处理

正常情况,我们捕获一个错误可能会这么写代码

const Koa = require("koa")
//创建实例
const app = new Koa()
app.use( ctx => {try {JSON.parse("dsssssss")ctx.body = "hello koa"}catch(err){ctx.response.status = 500ctx.response.body = "服务端内部错误"}
})
app.listen(3000, () => {console.log("服务运行在:http://localhost:3000");
})

 koa也给我们提供了内置函数简化500的错误响应

app.use( ctx => {try {JSON.parse("dsssssss")ctx.body = "hello koa"}catch(err){ctx.throw(500)}
})

 对于多个异常,我们可以借助koa的洋葱模型进行捕获,用最外层的中间件进行异常捕获,内层的中间件异常最终全部会被koa最外层的中间件所捕获。

const Koa = require("koa");
//创建实例
const app = new Koa();
app.use(async (ctx, next) => {try {await next();} catch (err) {console.log(111);ctx.response.status = 500;ctx.body = "服务器内部错误";}
});
app.use((ctx) => {console.log(222);JSON.parse("dsssssss");ctx.body = "hello koa";
});app.listen(3000, () => {console.log("服务运行在:http://localhost:3000");
});

最外层的中间件函数必须写成async的形式,不然异常不会被捕获进去

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86129.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86129.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/86129.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA与通义联合:智能编程效率革命

IDEA与通义联合&#xff1a;智能编程效率革命 当最强Java IDE遇上顶尖AI助手&#xff0c;会碰撞出怎样的生产力火花&#xff1f; 思维导图解读&#xff1a;智能编程工作流 #mermaid-svg-uTAcSs1kBBmDwGfM {font-family:"trebuchet ms",verdana,arial,sans-serif;font…

Docker 数据持久化完全指南:Volume、Bind Mount 与匿名卷

Docker 数据持久化完全指南&#xff1a;Volume、Bind Mount 与匿名卷 引言 在 Docker 中&#xff0c;容器的文件系统默认是临时的&#xff0c;容器删除后数据也会丢失。为了实现数据持久化&#xff0c;Docker 提供了多种存储方式&#xff0c;主要包括&#xff1a; docker vo…

OSS跨区域复制灾备方案:华东1到华南1的数据同步与故障切换演练

1. 引言 对象存储服务&#xff08;OSS&#xff09;已成为现代数据架构的核心组件。随着业务全球化&#xff0c;跨区域数据灾备从“可选”变为“必选”。本文以阿里云OSS为实验环境&#xff0c;实战演练华东1&#xff08;杭州&#xff09;到华南1&#xff08;深圳&#xff09;的…

前端登录状态管理:主流方案对比与安全实践指南

根据目前业内前端登录状态管理的主流设计方案&#xff0c;及其演进趋势进行汇总&#xff0c;生成主要包括如下内容的报告&#xff1a; 登录状态保持的基础原理&#xff1a;从HTTP无状态问题出发解析技术需求&#xff0c;使用表格对比核心挑战。主流技术方案对比&#xff1a;详…

动手用 Web 实现一个 2048 游戏

文章目录 为什么选择 2048&#xff1f;关键技术点与算法详解HTML 结构&#xff1a;搭建游戏界面CSS 样式&#xff1a;美化游戏界面JavaScript 核心逻辑&#xff1a;驱动游戏运行1&#xff09;数据结构&#xff1a;二维数组表示游戏网格2&#xff09;核心算法&#xff1a;添加随…

frp v0.62.1内网穿透搭建和使用

官网&#xff1a;https://gofrp.org/zh-cn/ Github&#xff1a;https://github.com/fatedier/frp 开源项目 frp frp 是一种快速反向代理&#xff0c;允许您将位于 NAT 或防火墙后面的本地服务器公开给 Internet。目前支持 TCP 和 UDP&#xff0c;以及 HTTP 和 HTTPS 协议&…

如何使用 USB 数据线将文件从 PC 传输到 iPhone

虽然用 USB 数据线将文件从 PC 传输到安卓设备非常容易&#xff0c;但对于 iPhone 用户来说&#xff0c;情况就不同了。不过&#xff0c;幸运的是&#xff0c;我们找到了三种可靠的方法&#xff0c;可以使用 USB 数据线将文件从 PC 传输到 iPhone&#xff0c;让您轻松完成这项任…

【C++高阶三】AVL树深度剖析

【C高阶三】AVL树深度剖析 1.什么是AVL树2.AVL树的实现2.1节点类和基本结构2.2插入2.3旋转处理2.3.1左单旋2.3.2右单旋2.3.3左右双旋2.3.4右左双旋 1.什么是AVL树 AVL树也叫二叉搜索平衡树 因为二叉搜索树如果插入顺序是有序的&#xff0c;那么这棵树的查找效率将会是O(N)&…

LangChain 文本分割器深度解析:从原理到落地应用(上)

食用指南 LangChain 作为大语言模型应用开发框架&#xff0c;文本分割器是其核心组件之一&#xff0c;本文以此作为切入点&#xff0c;详细介绍文本分割的作用、策略、以及常见的文本切割器应用。考虑到篇幅过长&#xff0c;故拆分为上、中、下三篇&#xff0c;后续会在中篇介…

【Java高频面试问题】高并发篇

【Java高频面试问题】高并发篇 Kafka原理核心组件高吞吐核心机制高可用设计 Kafka 如何保证消息不丢失如何解决Kafka重复消费一、生产者端&#xff1a;根源防重二、消费者端&#xff1a;精准控制三、业务层&#xff1a;幂等性设计&#xff08;核心方案&#xff09; 如何解决Kaf…

关于结构体,排序,递推的详细讲解(从属于GESP四级)

本章内容 排序算法基础 结构体 递推 简单双指针 一、排序算法基础三剑客 冒泡 Bubble、选择 Selection、插入 Insertion 1. 预备知识 1.1 排序算法评价指标 指标 含义 影响答题的典型问法 时间复杂度 算法在最坏、平均或最好情况下所需比较 / 交换次数 “写出此算法…

离线部署docker中的containerd服务

containerd 是一个行业标准的容器运行时&#xff0c;专注于简单、健壮的容器执行。它是从 Docker 中分离出来的项目&#xff0c;旨在作为一个底层的运行时接口&#xff0c;供更高层次的容器管理层使用。 containerd 负责镜像传输、存储、容器执行、网络配置等工作。它向上为 Do…

web布局15

CSS 网格布局除了提供定义网格和放置网格项目的相关属性之外&#xff0c;也提供了一些控制对齐方式的属性。这些控制对齐方式的属性&#xff0c;和 Flexbox 布局中的对齐属性 justify-* 、align-* 、*-items 、*-content 、 *-self 等是相似的&#xff1a; 在网格布局中可以用它…

leetcode 291. Word Pattern II和290. Word Pattern

目录 291. Word Pattern II 290. Word Pattern 291. Word Pattern II 回溯法哈希表 class Solution {unordered_map<char,string> hashmap;unordered_set<string> wordset; public:bool wordPatternMatch(string pattern, string s) {return backtrack(pattern,…

大模型的开发应用(十三):基于RAG的法律助手项目(上):总体流程简易实现

RAG法律助手项目&#xff08;上&#xff09;&#xff1a;总体流程简易实现 1 项目介绍1.1 方案选型1.2 知识文档 2 文档解析3 知识库构建3.1 构建知识节点3.2 嵌入向量初始化3.2 向量存储 4 查询4.1 初始化大模型4.2 模型响应4.2 本文程序存在的问题 完整代码 1 项目介绍 本项…

覆盖迁移工具选型、增量同步策略与数据一致性校验

1 引言 在当今数据驱动的时代&#xff0c;数据迁移已成为系统迭代、数据库升级、云迁移和架构演进中的关键环节。根据Gartner的调研&#xff0c;超过70%的企业级数据迁移项目因工具选择不当或同步策略缺陷而延期或失败。数据迁移不仅仅是简单的数据搬运&#xff0c;而是涉及数…

`docker run -it --rm` 笔记250624

docker run -it --rm 笔记250624 docker run -it --rm 是一个强大且常用的 Docker 命令组合&#xff0c;特别适合交互式开发和调试场景。以下是详细解析和使用指南&#xff1a; 参数解析 参数作用典型场景-i保持 STDIN 打开&#xff08;交互模式&#xff09;需要输入命令的交…

解锁阿里云AnalyticDB:数据仓库的革新利器

AnalyticDB&#xff1a;云数据仓库新势力 在数字化浪潮中&#xff0c;数据已成为企业的核心资产&#xff0c;而云数据仓库作为数据管理与分析的关键基础设施&#xff0c;正扮演着愈发重要的角色。阿里云 AnalyticDB 作为云数据仓库领域的佼佼者&#xff0c;以其卓越的性能、创…

【PX30 Qt 5.15 交叉编译环境搭建完整指南】

PX30 Qt 5.15 交叉编译环境搭建完整指南 (Ubuntu 20.04 → PX30 aarch64) &#x1f3af; 项目概览 本指南详细记录了在Ubuntu 20.04上搭建针对Rockchip PX30的Qt 5.15.2交叉编译环境的完整过程&#xff0c;包括实际操作步骤、遇到的问题及解决方案。 目标平台: Rockchip PX3…

深入理解读写锁 ReadWriteLock

在高性能并发编程中&#xff0c;如何有效地管理共享资源的访问是核心挑战之一。传统的排他锁&#xff08;如ReentrantLock&#xff09;在读多写少的场景下&#xff0c;性能瓶颈尤为突出&#xff0c;因为它不允许并发读取。Java并发包&#xff08;java.util.concurrent.locks&am…