Contentful で個別ページを静的出力するときも limit を設定しよう
今年このサイトの記事数が100を超えた。それはそれでめでたいことであったが同時に想定していなかった問題も出た。一部の記事が 404 Not found になったのだ。
このサイトは、Next.js の export
を使ってで静的にHTMLを出力している。各記事の一覧は正常に表示されていて、各記事だけビルド時に生成されていないという状態。これはつまり個別記事生成時に問題があるということだ。現在記事一覧はページングを使って取得しているのでページあたりの記事表示数のために limit
を5件に設定している。
一方個別の記事の出力時 generateStaticParams()
で利用している getEntries()
関数には limit
を指定していなかったのである。なんらかの方法で全ページを取得してビルドすることにしていたのだがこれがデフォルトで100件が設定されていることに気づかなかった。
よくよく考えてみれば limit
がデフォルト値なしで全件取得というのは危険な API だと思うが、オープンした当時はそこまで考えが回っていなかった。ドキュメントによれば、
Note: The maximum number of entries returned by the API is 1000. The API will throw a BadRequestError for values higher than 1000 and values other than an integer. The default number of entries returned by the API is 100.
とあり、100がデフォルトで最大が1000とのこと。1000を超える場合はちょっと工夫が必要だが、しばらくは到達しそうにないので問題ないかと思われる。ということで以下のように設定。
export const generateStaticParams = async () => {
const response = await getArticles(client, {
locale: "ja-JP",
"fields.publishTo": "ja",
limit: 1000,
});
return response?.items?.map((item) => ({
slug: item?.sys?.id,
}));
};