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访问。

对于某些敏感的信息如 App 密钥等的,则不适宜放在环境变量中,而且推荐放在专门的加密文件.dev.vars中,该文件与wrangler.toml同级,放在项目工程根目录下。文件内容如:

SECRET_KEY=value
API_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

代码中的读取方式与环境变量的一样。

访问 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sp42a

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值