高木のブログ

Cloudflare Workers と Hono でランダムに記事を表示させるやつを作った

2023/01/03

Cloudflare Workers と Hono を使ってちゃんとした成果物を作ってないなと思ったので、ランダムに記事を表示させるやつを作った

これが “ちゃんとした成果物” に入るかどうかは疑問

成果物

https://random.takagi.blog

対象の記事はデータの入れ込みに手を抜いたので、現時点では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

余力があればやりたいこと

最新の記事も対象にしたいので、記事データを自動更新する仕組み


SNS でシェアする


ytkg

Written by ytkg, Twitter, GitHub