あと34本で、記事が消え始める作りだった
サイト全体を見直していて、あと34本で記事が消え始める作りになっていることに気づきました。
エラーは出ません。ビルドも通ります。ただ、書いた記事が一覧にもサイトマップにも出なくなります。
件数の上限を置いたまま忘れると何が起きるか。なぜ気づけないのか。そして上限を上げるのではなく、外した話です。
1行だけの問題だった
CMSへの問い合わせに、こう書いてありました。
posts(first: 100) {
「最初の100本を取ってくる」という意味です。書いた当時は記事が10本もなく、100は十分に大きい数でした。
いま66本あります。残り34本。
101本目に何が起きるか
ここが厄介なところです。何も起きません。
| 確かめる場所 | 101本目を書いたあと |
|---|---|
| CMSの管理画面 | 記事はある。公開済みになっている |
| サイトの表示 | 正常。崩れない |
| ビルド | 成功する |
| エラーの通知 | 来ない |
| 一覧・サイトマップ | その記事だけ載らない |
気づく手段が、「あれ、あの記事どこへ行った」と思うことだけです。しかも消えるのは一番古い記事か新しい記事かも、並び順次第で変わります。
この行を書いたのは半年近く前で、そのときは「100もあれば当分平気」と思って書いています。実際そのとおりでした。
問題は、平気な期間が長いことです。長く問題が出ないと、その数字があること自体を忘れます。そして忘れたころに到達します。
上げるか、外すか
いちばん簡単なのは、100を500にすることです。1文字の修正で済みます。
ただ、それだと同じ壊れ方が先に延びるだけです。500本書いたときに、同じように何も知らせずに消え始めます。そのときの自分は、いまより確実に忘れています。
そこで、区切りそのものを外しました。
posts(first: 100, after: 前回の続きの位置) {
pageInfo { hasNextPage endCursor }
...
}
100本ずつ取って、「まだ続きがある」と言われているあいだは取りに行き続けます。記事が何本になっても、全部取れます。
実は上限を1つ残しています。30回まで、という繰り返しの回数です。
これは記事数のためではありません。相手が壊れていて「まだある」と言い続けたときに、公開作業が終わらなくなるのを防ぐためです。100本ずつなので、ここに達するのは3000本を超えてからになります。
同じ「上限」でも、普通に使っていて到達するものと、異常時にしか到達しないものは別ものです。
同じ数字が、もう1か所にあった
直したあと、他にも同じ書き方が無いか探しました。サイトマップを作る処理にも、同じ100が入っていました。
こちらのほうが影響は大きい。一覧に出ないだけなら内部リンクからは辿れますが、サイトマップから漏れると検索エンジンに存在を知らせる手段が減ります。
両方とも同じ形に直しました。
気づけたのは、数えたから
この問題は、使っていても出てきません。見つかったのは、サイト全体を機械的に確かめていたときでした。
やったのは単純で、数を数えることです。記事が何本あるか、サイトマップに何件載っているか、一覧に何枚並んでいるか。
| 数えたもの | 分かったこと |
|---|---|
| 記事の本数(66) | 上限100まであと34本 |
| 一覧のHTMLの大きさ | 202KB。ほとんどが画面外のカード |
| 代替テキストの有無 | 62枚中21枚が未設定で、混ざっていた |
どれも見た目には出ていません。数えないかぎり、全部「問題なし」に見えます。
今回の学び
まず、「当分平気な数字」は、平気なあいだに忘れられるということ。書いた時点では正しい判断でしたが、正しさが長く続くほど、その存在を思い出すきっかけが無くなります。
次に、上限を上げるのは、同じ壊れ方を先送りにするだけだということ。500にしても、500本目に同じことが起きます。そのときの自分が覚えている見込みは、いまより低い。
そして、使っていて気づけない問題は、数えるしかないこと。表示は正常、ビルドも成功、エラーも無し。この状態で問題を見つける手段は、動かすことではなく数えることでした。
この記事を共有する
関連記事

Criticalが4件並んだ日にやったこと
朝、通知を見たらCriticalが4件並んでいました。どれも同じ相手、Next.js本体です。 この日にやったことを順に書きます。結論から言うと、上げました。ただ、上げる前にやったことのほうが本題です。 この記事で扱うこ […]

再試行は入れていた。それでもデプロイが落ちた
再試行の処理は、半年前から入れていました。CMSが500を返したら、少し待ってもう一度投げる。3回まで。 それでも、デプロイが落ちました。 この記事で扱うこと 再試行を入れてあったのに効かなかった話です。何が返ってきてい […]

ソース解説(5) 文字列を自分で組み立てる場所
このサイトで、HTMLを文字列として自分で組み立てている場所は2つあります。RSSフィードとサイトマップです。 画面に出るページは、部品を組み合わせれば勝手に出来上がります。この2つは違います。1行ずつ並べて、最後に文字 […]