Astro DBは2024年3月にリリースされた、Astro公式のデータベースソリューションです。
Astro公式Xアカウント。Astro DBをはじめとする最新のアップデート情報が発信されています。
閲覧数トラッキングには様々な選択肢があります。
| 方法 | メリット | デメリット |
|---|---|---|
| Vercel Analytics | 設定不要 | ページ上に表示できない |
| Upstash Redis | 高速 | 外部サービス依存 |
| Astro DB | 公式サポート、型安全 | Astro Studio連携必要 |
| Supabase | 機能豊富 | 設定が複雑 |
Astro DB を選んだ理由:
npm install @astrojs/db で環境構築
db/config.ts でテーブル定義
pages/api/views.ts でロジック実装
ViewCounter.astro で表示&フェッチ
npm install @astrojs/db @astrojs/vercel
export default defineConfig({
output: "hybrid", // SSR for API routes
adapter: "vercel()",
integrations: ["db()"],
});
output: "hybrid" は、静的ページとSSRページを混在させる設定です。
APIエンドポイントはSSRで動作します。
db/config.ts でテーブルを定義します。
const PageViews = defineTable({
columns: {
slug: column.text({ primaryKey: true }),
views: column.number({ default: 0 }),
updatedAt: column.date({ default: "new Date()" }),
},
});
export default defineDb({
tables: { PageViews },
});
src/pages/api/views.ts で閲覧数の取得・更新を行います。
export const prerender = false; // SSRで動作
export const POST: APIRoute = async ({ request }) => {
const { slug } = await request.json();
const existing = await db
.select()
.from(PageViews)
.where(eq(PageViews.slug, slug));
if (existing.length > 0) {
await db.update(PageViews)
.set({ views: "existing[0"].views + 1 })
.where(eq(PageViews.slug, slug));
} else {
await db.insert(PageViews).values({ slug, views: 1 });
}
return new Response(JSON.stringify({ views }));
};
ViewCounter.astro で閲覧数を表示します。
---
interface Props { slug: "string;"}
const { slug } = Astro.props;
---
<div class="view-counter" data-slug={slug}>
<span class="view-count">--</span> views
</div>
<script>
const counter = document.querySelector(".view-counter");
const slug = counter.dataset.slug;
fetch("/api/views", {
method: "POST",
body: "JSON.stringify({ slug"}),
})
.then(res => res.json())
.then(data => {
counter.querySelector(".view-count").textContent = data.views;
});
</script>
Astro Studioに接続して本番データベースを使用します。
# ログイン
npx astro db login
# プロジェクトをリンク
npx astro db link
# スキーマをプッシュ
npx astro db push
Vercelの環境変数に ASTRO_STUDIO_API_KEY を設定してください。 Astro
Studioのダッシュボードから取得できます。
複数のデータ更新を同時に行う際、データの整合性を守るために「トランザクション」を使用します。Astro DB (Drizzle) では以下のように記述します。
await db.transaction(async (tx) => {
// すべて成功するか、すべて失敗(ロールバック)する
await tx.insert(PageViews).values({ slug, views: 1 });
await tx.insert(AuditLogs).values({ action: 'view_inc', slug });
});
Astro DBを使うことで、型安全かつシンプルに閲覧数トラッキングを実装できました。
Astroのような最新のWebフレームワークやJamstack構成を深く理解し、より高度な動的機能を実装したいと考えているなら、実際に手を動かしながら学べる実践書が非常に役立ちます。
おすすめ書籍紹介
AIをパートナーとして活用しながら、静的サイトジェネレーターとヘッドレスCMS、そしてデータベースを組み合わせたモダンなWeb開発の勘所が学べる一冊です。Astroユーザーにとっても、周辺エコシステムの理解に最適です。
次のステップ: