Hono 框架使用经验谈
Hono🔥是一个小型、快速并开源的 Serverless Web 框架,用 TypeScript 写就。它适用于任何JavaScript运行时:Cloudflare Workers,Fastly Compute@Edge,Deno,Bun,Vercel,Netlify,Lagon,AWS Lambda,Lambda@Edge和Node.js,当然最多还是 面向 Edges Web框架。它为那么多不同的 Serverless 厂商提供了一个简单一致的 API 接口,而无需开发者去逐一兼容。在这点意义上讲,不亚于当年 jQuery.js 为解决跨浏览器问题而提供统一的 API。
推荐通过官方文档、官方例子来学习 Hono,这个介绍文章也不错。
强大的路由功能
起初针对 Cloudflare Worker 开发,笔者就想找一个比较好的路由框架,因为原生的 Wokers API 直接使用的话实在太原始。在物色了 Hono 之后,发现了其强大的所在。其中关键的路由功能更不在话说,——这里就不展开说了,大家可以直接看文档了解使用用法。
值得一提的是 Hono 的路由算法。这个算法笔者在 Java 重复 Spring MVC 轮子时候研究过,是基于树简单的出栈和入栈。没想到 Hono 作者原型也考虑过了树的算法,——不过他提出效率更高的 RegExpRouter 算法。作者还在文档中介绍了好几种路径的匹配算法,以作对比。

Web 的一些加强设置
更好的错误提示:
const app = new Hono<{ Bindings: Bindings }>();app.onError((err, c) => {console.error(`${err}`);return c.json({ msg: err.toString() });
});app.notFound(c => c.text('Not found', 404));
访问环境变量
我们知道,在 Wokers 中可以通过环境编辑来进行相关的配置,那样就不用写死到代码之中。比如这样子的,在 Worker 页面里配置:

然后在你的 JS 代码里面通过全局变量就可以时间访问,比如SHORT_URL_DEFAULT_LEN这个是全局变量,它的值是数字 9。
那么在 Hono 环境中怎么访问这个全局变量呢?首先 Hono 推崇的 TypeScript 语言中并不推崇使用全局变量,而是将所有环境变量放到c.env的集合中,并带有强类型的;其次,Hono 仍基建于 Cloudflare 官方的 Wrangler 开发环境,你可以在 Wrangler 配置文件wranger.toml中设置环境变量,而无需到其页面上设置。

如上如 [vars] 部分即为环境变量的设置。然后在你的 ts 中如下获取环境变量。

首先声明一个type,并指定变量名称及其类型,然后作为泛型传入Hono构造器函数中。最后可以通过c.env.MY_VAR访问。
访问 Cloudflare 资源
我们知道,在 Wokers 中可以通过全局变量来访问 Cloudflare 的资源,如 KV 数据库、R2 OSS 或者 Durable 对象。这个全局变量又来自于你在 Cloudflare 页面中的绑到,如同上面的环境变量。在 Hono 绑到的做法也类似,如法炮制,在type中绑定。
type Bindings = {MY_BUCKET: R2Bucket // 绑定 R2 OSS,注意这个类型来自于官方的 workers-types 项目LINKS: KVNamespace // KV 数据库一SHORT_URL_KV: KVNamespace // KV 数据库二
}const app = new Hono<{ Bindings: Bindings }>()// Access to environment values
app.put('/upload/:key', async (c, next) => {const key = c.req.param('key')await c.env.MY_BUCKET.put(key, c.req.body)return c.text(`Put ${key} successfully!`)
})
我们同时引入了 KV 数据库及 R2 OSS,那么在配置文件中wrangler.toml中,配置如下,注意kv_namespaces有两个不同的配置。

加密的配置
TODO
用户认证
TODO
相关文章:
Hono 框架使用经验谈
Hono🔥是一个小型、快速并开源的 Serverless Web 框架,用 TypeScript 写就。它适用于任何JavaScript运行时:Cloudflare Workers,Fastly ComputeEdge,Deno,Bun,Vercel,Netlify&#x…...
mac 下配置mysql的全局环境变量
前言 如果你还没有安装mysql,请参考这篇文章手把手教你MAC本地数据库的安装与使用:mysql python (pymysql)【一】 - 知乎 正文 1.打开终端,输入命令”echo $SHELL“,显示当前的shell ⚠️本人使用的终端shell是zsh,如果你使用…...
小红书云原生 Kafka 技术剖析:分层存储与弹性伸缩
面对 Kafka 规模快速增长带来的成本、效率和稳定性挑战时,小红书大数据存储团队采取云原生架构实践:通过引入冷热数据分层存储、容器化技术以及自研的负载均衡服务「Balance Control」,成功实现了集群存储成本的显著降低、分钟级的集群弹性迁…...
Python实现解码二进制数据以匹配给定的C++结构体
要在Python中实现解码二进制数据以匹配给定的C结构体Ytest,你需要了解每个字段在结构体中的偏移量(由于结构体内存对齐,这些偏移量可能与字段的顺序和大小不完全对应)。不过,在没有指定内存对齐的情况下,我…...
实施阶段(2024年5月)
【项目活动1】斐波拉契数列第n项的值? 数学思想:第一项和第二项的值都为1,从第三项开始值为前两项的和。 方法一:迭代 迭代变量:f1和f2 迭代表达式:f1,f2f2,f1f2 计数器:i 迭代表达式运算…...
(delphi11最新学习资料) Object Pascal 学习笔记---第13章第3节 (弱引用是系统托管的 )
13.4.2 弱引用是系统托管的 弱引用的托管是一个非常重要的内容。换句话说,系统会在内存中保存一个弱引用列表,当对象被销毁时,系统会检查是否有任何弱引用指向该对象,如果有,系统会将实际引用赋值为 nil࿰…...
安装WordPress
第 1 步:下载并解压 wget https://wordpress.org/latest.tar.gz 然后使用以下命令提取包: tar -xzvf latest.tar.gz 第 2 步:创建数据库 比如数据库名称为wordpress,编码格式为 utf8mb4_general_ci 第 3 步:设置wp-con…...
【STL库源码剖析】list 简单实现
从此音尘各悄然 春山如黛草如烟 目录 list 的结点设计 list 的迭代器 list 的部分框架 迭代器的实现 容量相关相关函数 实现 insert 在指定位置插入 val 实现 push_back 在尾部进行插入 实现 erase 在指定位置删除 实现 pop_back 在尾部进行删除 实现 list 的头插、头删 实现…...
web前端框架设计第十一课-常用插件
web前端框架设计第十一课-常用插件 一.预习笔记 1.路由的基础使用 2.动态路由 3.嵌套路由 二.课堂笔记 三.课后回顾 –行动是治愈恐惧的良药,犹豫拖延将不断滋养恐惧...
Java基础-注解
注解本质是继承了Annotation接口的一个接口 首先,我们通过键值对的形式可以为注解属性赋值,像这样:Hello(value “hello”)。 接着,你用注解修饰某个元素,编译器将在编译期扫描每个类或者方…...
SpringCloud之SSO单点登录-基于Gateway和OAuth2的跨系统统一认证和鉴权详解
单点登录(SSO)是一种身份验证过程,允许用户通过一次登录访问多个系统。本文将深入解析单点登录的原理,并详细介绍如何在Spring Cloud环境中实现单点登录。通过具体的架构图和代码示例,我们将展示SSO的工作机制和优势&a…...
二分查找算法详讲(三种版本写法)原创
介绍: 二分查找算法(Binary Search)是一种在有序数组中查找目标元素的算法。 它的基本思想是通过将目标元素与数组的中间元素进行比较,从而将搜索范围缩小一半。 如果目标元素等于中间元素,则搜索结束;如果目标元素小…...
Git钩子(Hooks)之commit之前自动执行脚本
介绍 官方文档: 英文:https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks中文:https://git-scm.com/book/zh/v2/自定义-Git-Git-钩子 下面只复制了pre-commit部分文档,其他详见官方文档。 Git Hooks Like many other…...
nano机器人2:机械臂的视觉抓取
前言 参考链接: 【机械臂入门教程】机械臂视觉抓取从理论到实战 GRCNN 通过神经网络,先进行模型训练,在进行模型评估。 机械臂逆运动学求解 所有串联型6自由度机械臂均是可解的,但这种解通常只能通过数值解法得到,计算难度大&am…...
技术速递|宣布 Java on Azure 开发工具支持 Java on Azure Container Apps
作者:Jialuo Gan 排版:Alan Wang 在 Microsoft Build 2024 期间宣布,Azure Container Apps 现在可为 Java 开发人员提供丰富的操作功能。(详细内容请参见本博客)。 我们很高兴地与大家分享,Azure Toolkit for Intelli…...
随机森林算法实现分类
随机森林算法实现对编码后二进制数据的识别 1.直接先上代码! import numpy as np import pandas as pd from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import …...
Ubuntu卸载软件
在删除这些目录之前,你必须确定一个非常重要的事情:确认没有任何服务正在使用这些版本的 PHP。如果你删除了正在使用的 PHP 版本的扩展目录,那么依赖于这个版本的 PHP 的网站或服务可能会停止工作。 如果你确定某个版本的 PHP 没有在使用中&…...
网络工程师:网络可靠性技术
一、可靠性 平均故障间隔时间MTBF(Mean Time Between Failure)和平均修复时间MTTR(Mean Time to Repair)这两个指标来评价系统的可靠性。 1、平均故障间隔时间MTBF MTBF是指一个系统无故障运行平均时间,通常以小时为单位。MTBF越大可靠性越高。 2、平均修复时间MTTR…...
科技引领未来:高速公路可视化
高速公路可视化监控系统利用实时视频、传感器数据和大数据分析,通过图扑 HT 可视化展示交通流量、车速、事故和路况信息。交通管理人员可以实时监控、快速响应突发事件,并优化交通信号和指挥方案。这一系统不仅提高了道路安全性和车辆通行效率࿰…...
Golang发送POST请求并传递JSON数据
客户端 package mainimport ("c02_get_param/common""fmt""zdpgo_resty" )func main() {// Create a Resty Clientclient : zdpgo_resty.New()// 设置字符串resp, err : client.R().SetHeader("Content-Type", "application/jso…...
PyTorch Geometric安装避坑指南:从CUDA版本选择到依赖包自动安装的完整流程
PyTorch Geometric工程化安装指南:从版本匹配到环境复现的深度实践 在深度学习领域,图神经网络(GNN)正成为处理非欧几里得数据的利器,而PyTorch Geometric(PyG)作为最受欢迎的GNN框架之一,其安装过程却常让开发者陷入"依赖地…...
OWL ADVENTURE编辑功能展示:一键换装、智能擦除,效果自然
OWL ADVENTURE编辑功能展示:一键换装、智能擦除,效果自然 1. 编辑功能概览:像玩游戏一样修图 OWL ADVENTURE的图片编辑功能让人眼前一亮。不同于传统修图软件的复杂操作,它通过自然语言指令就能完成各种编辑任务,效果…...
Claude Code 命令行参数实践指南
前言 很多人第一次打开 Claude Code,只会输入 claude,然后开始聊天。这当然可以,但就像开车只会踩油门一样——你根本没用上方向盘和变速箱。 命令行参数(CLI Flags)就是那些被忽视的"方向盘"。掌握它们&a…...
3分钟打造个性化英雄联盟体验:LeaguePrank工具让段位展示彻底自定义
3分钟打造个性化英雄联盟体验:LeaguePrank工具让段位展示彻底自定义 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 你是否曾想在好友面前展示独特的游戏段位?是否希望自己的游戏生涯页面与众不同&…...
Clipy:macOS效率工具中的自动化剪贴板增强专家
Clipy:macOS效率工具中的自动化剪贴板增强专家 【免费下载链接】Clipy Clipboard extension app for macOS. 项目地址: https://gitcode.com/gh_mirrors/cl/Clipy 你是否曾遇到这样的窘境:刚复制的重要文本被新内容覆盖,不得不重新打开…...
Nunchaku FLUX.1-dev多场景实战:游戏原画/产品渲染/艺术创作全覆盖
Nunchaku FLUX.1-dev多场景实战:游戏原画/产品渲染/艺术创作全覆盖 你是不是也遇到过这样的烦恼:想画一张游戏角色概念图,但手绘功底不够;想给产品做个渲染图,3D软件又太复杂;脑子里有绝妙的艺术创意&…...
墨语灵犀镜像灰度发布:Kubernetes滚动更新无感升级实践
墨语灵犀镜像灰度发布:Kubernetes滚动更新无感升级实践 1. 引言:优雅升级的艺术挑战 在现代应用部署中,如何实现平滑无感的服务升级一直是个技术难题。特别是对于「墨语灵犀」这样注重用户体验的深度翻译工具,任何服务中断或体验…...
DSP28335 EPWM模块关键寄存器配置实战指南
1. EPWM模块基础与核心寄存器概览 DSP28335的增强型PWM(EPWM)模块是电机控制、电源转换等实时控制系统的核心外设。我第一次接触这个模块时,被它强大的灵活性震撼到了——6对独立的EPWM通道,每对都能生成两路互补或独立的PWM波形。…...
Paimon实时数据湖实战:五种分桶模式选型与性能调优指南
1. Paimon分桶机制的核心价值 分桶是Paimon数据湖架构中提升性能的关键设计。想象你管理一个超大型图书馆,如果所有书籍都堆放在一起,每次找书都需要全馆搜索。但如果你按照书籍编号将书架分成100个区域,找书时只需计算编号哈希就能直达对应区…...
PostgreSQL实战:使用pg_dump精准导出特定模式下的表结构
1. 为什么需要精准导出特定模式下的表结构 在实际的数据库管理工作中,我们经常会遇到只需要导出特定模式(schema)下表结构的需求。比如在微服务架构中,每个服务可能对应数据库中的一个模式;或者在进行数据库迁移时&…...
