#debugging (2)
問題
Astro のページファイル(.astro)でフロントマター内に定義した定数を、export async function getStaticPaths() から参照すると ReferenceError が発生する。
---
const ITEMS_PER_PAGE = 10;
export async function getStaticPaths() {
const pageSize = ITEMS_PER_PAGE; // ❌ ReferenceError
// ...
}
---
原因
getStaticPaths() はビルド時に別のスコープで実行されるため、フロントマターで定義した定数にアクセスできない。
解決策
パターン1: getStaticPaths() 内で定義
---
export async function getStaticPaths() {
const ITEMS_PER_PAGE = 10; // ✓ ローカルで定義
// ...
}
---
パターン2: 外部ファイルからインポート
// src/config.ts
export const ITEMS_PER_PAGE = 10;
---
import { ITEMS_PER_PAGE } from '../config';
export async function getStaticPaths() {
const pageSize = ITEMS_PER_PAGE; // ✓ インポートされた定数
// ...
}
---
デバッグのコツ
getStaticPaths() の catch でエラーを握り潰すと、ページが0件生成される(404)という症状になり、原因特定が困難。最低限ログ出力を:
export async function getStaticPaths() {
try {
// ...
} catch (error) {
console.error('getStaticPaths failed:', error); // 必ず出力
return [];
}
} 問題
REST APIとRust CLIを別々に開発すると、レスポンスのJSON構造が噛み合わなくなる。
典型的な不一致パターン:
| API が返す | CLI が期待する | エラー |
|---|---|---|
[{...}] (配列直接) | { "items": [{...}] } (ラップ) | invalid type: map, expected a sequence |
{ "success": true } | { "message": "..." } | missing field 'message' |
{ "id", "name", "extra_field" } | { "id", "name" } (フィールド不足) | missing field 'extra_field' ではなく別のエラー |
対策
- APIレスポンスは常にオブジェクトでラップする(
{ tasks: [...] }形式)。拡張性も高い - Rust側のデシリアライズ構造体は、APIが返す全フィールドを網羅するか、
#[serde(deny_unknown_fields)]を付けない(デフォルトで未知フィールドは無視される) - API仕様を先に決めてから両方実装する。OpenAPI等で契約を明文化するのがベスト