Owen的博客

Owen的博客

马上订阅 Owen的博客 RSS 更新: https://www.owenyoung.com/atom.xml

在 Cloudflare Workers 部署一个 JSON as a Storage 服务

2023年3月9日 01:38

我特别喜欢JSON, 因为它真的很小巧和简单,幸运的是,它还是我使用的主要语言 Javascript 和 Typescript 里的一级公民,也太幸运了吧!

我经常用本地的 JSON 文件来存储一些需要持久化的数据,这样可以省掉要调试 sql 或者 redis 的大把时间,而且数据都是明文纯文本存储,搜索,定位问题都很方便,比如整个Buzzing 还有整个Track Awesome List 都只使用 JSON 作为持久化存储的格式。

但是像这样比较大的项目,我会把 JSON 文件存储到 Cloudflare 的 R2 服务里(类似 AWS 的 S3 ),但是除此之外,我还有很多小小的工作流,这些东西通常也需要一个持久化的数据存储,比如一个 RSS 的监控服务,我需要记录哪些 ID 已经被发送过了,这是一个很常见的需求,但是要寻找一个适合的服务也不是一件容易的事,所以今天我尝试搜索了一下 JSON as a Storage 方案,最后决定采用 Cloudfalre 的 Workers 作为 host, 其实也就几十行代码的事,Workers 好就好在一次部署,终生不用再管,所以特别适合这种服务。

部署之后,你会得到一个这样的接口:

写 json🔗

curl 'https://json.owenyoung.com/foo/bar?key=abc' --data '{"foo":"bar"}'

读 json🔗

curl 'https://json.owenyoung.com/foo/bar?key=abc'

示例:如何记录已发送的 RSS ids🔗

let sentArr = [];
const response = await fetch(
  "https://json.owenyoung.com/rss/hackernews/sent?key=abc"
);
if (response.ok) {
  sentArr = await response.json();
} else {
  if (response.status === 404) {
    sentArr = [];
  } else {
    throw new Error(`${response.status}: ${response.statusText}`);
  }
}

console.log("current sentArr", sentArr);

// do some work

sentArr.push("456");

// write the newest sentArr to KV

const writeResponse = await fetch(
  "https://json.owenyoung.com/rss/hackernews/sent?key=abc",
  {
    method: "POST",
    body: JSON.stringify(sentArr),
  }
);

if (!writeResponse.ok) {
  throw new Error(`${writeResponse.status}: ${writeResponse.statusText}`);
}

好吧,上面那一坨有点烦,我封装了一个叫 JSONBin 的类...