症状
2月で止まっていたnoteアーカイブを、note公開APIから自動同期する仕組みに切り替えて41件を一括追補した。同期は成功、検証も通過。ところがビルドが NoMatchingStaticPathFound で停止した。要求パスは /tags/副業/。
昨日まで通っていたビルドが、データを増やした途端に落ちる。コードは(ほぼ)触っていないのに。
検証環境
Astro 7.0.7の静的サイト。noteの記事メタデータをアーカイブJSONに取り込み、カテゴリ別のタグページを getStaticPaths で静的生成する構成。
原因候補と確認したこと
最初に疑ったのは自分が書いた同期スクリプト。でも生成されたJSONは検証を通っている。
エラーメッセージをよく見ると、要求パスが日本語の /tags/副業/。既存のカテゴリは全部英字スラグ(ai、podcast など)だったのに、新規記事のハッシュタグ由来で「副業」という未知カテゴリが混ざっていた。
実際の原因
カテゴリ→スラグ変換に、未知カテゴリ用のフォールバックとして encodeURIComponent(category) が仕込まれていた。これが %E5%89%AF%E6%A5%AD のようなエンコード済みスラグを登録する一方、Astroの静的ルーティングはデコード済みの /tags/副業/ で照合する。登録名と照合名が別表記になり、一致するページが見つからない。
質が悪いのは、既知カテゴリしか存在しなかった数ヶ月間はこのコードが一度も実行されず、正常に見えていたこと。データが増えた日に初めて爆発する、静かな地雷だった。
解決方法と解決確認
表示側でエンコード問題を頑張るのはやめて、取り込み口で正規化する方針にした。同期スクリプトがnoteのハッシュタグをサイトの既知カテゴリ(AI/ゲーム開発/ポッドキャスト/コラム/未分類)へマッピングし、非ASCIIスラグをそもそも発生させない。
再同期→ビルド成功(29ページ)→本番デプロイ後、アーカイブ一覧に73件が並んでいることを確認した。
今回得たEXP
ひとつめ。URLスラグの自動フォールバックに非ASCII文字を通さない。エンコードの往復はどこかで必ず表記が食い違う。
ふたつめ。外部サービスの自由なタグは、取り込み口で自前の分類に正規化する。「あとで表示側がなんとかする」は、なんとかならない。
現場でいうと、資材の受け入れ検収を省略して置き場に直行させた結果、規格外の資材が工程の奥で詰まった状態。検収はゲートでやる。