Cloudflare Workers と Hono でランダムに記事を表示させるやつを作った
2023/01/03
Cloudflare Workers と Hono を使ってちゃんとした成果物を作ってないなと思ったので、ランダムに記事を表示させるやつを作った
これが “ちゃんとした成果物” に入るかどうかは疑問
成果物
対象の記事はデータの入れ込みに手を抜いたので、現時点では2022/12/31までの記事になっている
仕組み
Cloudflare Workers と Hono に加えて、記事データの保存先として Cloudflare D1 も使っている
アクセスが来たらデータベースからランダムに記事を1つ取り出してリダイレクトさせているだけ
src/index.ts
import { Hono } from 'hono'
interface Env {
DB: D1Database
}
type Article = {
id: number
title: string
link: string
}
const app = new Hono<{ Bindings: Env }>()
app.get('/', async (c) => {
const article = await c.env.DB.prepare(
`select * from articles order by random()`
).first<Article>()
return c.redirect(article.link)
})
export default app
ランダムに記事を1つ取り出すのに、order by random() という SQL アンチパターンを使ってしまっているが、このくらいの用途では問題ないだろうと判断した
記事データは書き慣れている Ruby でサクッと INSERT 文を生成して D1 にぶっ込んだ
app.rb
require 'rss'
rss = RSS::Parser.parse('https://takagi.blog/rss.xml')
rss.items.each.with_index(1) do |item, i|
puts "INSERT INTO articles VALUES (#{i}, '#{item.title}', '#{item.link}');"
end
$ ruby app.rb > data.sql
リポジトリ
https://github.com/ytkg/random-takagi-blog
余力があればやりたいこと
最新の記事も対象にしたいので、記事データを自動更新する仕組み