こんにちは。よっしーです(^^)
今日は、SvelteKitでのエラー処.理について解説しています。
背景
SvelteKitでのエラー処理について調査する機会がありましたので、その時の内容を備忘として記事に残しました。
エラー処理
エラーはソフトウェア開発において避けられない事実です。SvelteKit は、エラーの発生場所、エラーの種類、受信したリクエストの性質に応じて、エラーを異なる方法で処理します。
Expected errors
予期されるエラーは、@sveltejs/kit
からインポートされたerror
ヘルパーを使用して作成されます:
src/routes/blog/[slug]/+page.server.js
import { error } from '@sveltejs/kit';
import * as db from '$lib/server/database';
/** @type {import('./$types').PageServerLoad} */
export async function load({ params }) {
const post = await db.getPost(params.slug);
if (!post) {
error(404, {
message: 'Not found'
});
}
return { post };
}
これはSvelteKitがキャッチする例外を投げ、レスポンスのステータスコードを404に設定し、+error.svelte
コンポーネントをレンダリングします。この時、$page.error
はerror(...)
の第2引数として提供されたオブジェクトになります。
src/routes/+error.svelte
<script>
import { page } from '$app/stores';
</script>
<h1>{$page.error.message}</h1>
必要に応じて、エラーオブジェクトに追加のプロパティを加えることができます:
error(404, {
message: 'Not found',
code: 'NOT_FOUND'
});
それ以外の場合、便宜上、第2引数として文字列を渡すこともできます:
error(404, { message: 'Not found' });
error(404, 'Not found');
SvelteKit 1.xでは、error
を自分でthrow
する必要がありました。
これらの予期されるエラーを使用することで、アプリケーションの様々な部分で一貫したエラーハンドリングを実装できます。例えば、404 Not Foundエラー、認証エラー、バリデーションエラーなどを統一的に扱うことができます。また、これらのエラーは+error.svelte
コンポーネントでカスタマイズされたエラーページを表示するのに使用でき、ユーザーエクスペリエンスを向上させることができます。
コード解説
src/routes/blog/[slug]/+page.server.js
このコードは、SvelteKitのサーバーサイドロード関数を定義しています。特定のブログ記事(または類似のコンテンツ)をデータベースから取得し、ページにデータを提供するものです。以下に詳細を説明します:
- インポート文:
import { error } from '@sveltejs/kit';
import * as db from '$lib/server/database';
error
関数を SvelteKit からインポートしています。これはエラーを発生させるために使用します。- データベース操作のための関数を
$lib/server/database
からインポートしています。
- 型定義:
/** @type {import('./$types').PageServerLoad} */
この行は、以下の load
関数が SvelteKit の PageServerLoad
型に準拠していることを示しています。
load
関数の定義:
export async function load({ params }) {
// ...
}
- これはサーバーサイドの
load
関数です。ページがリクエストされたときに実行されます。 params
オブジェクトを引数として受け取ります。これにはURLパラメータが含まれます。
- データベースからの記事取得:
const post = await db.getPost(params.slug);
db.getPost()
関数を使用して、指定されたslug
に対応する記事をデータベースから非同期で取得しています。params.slug
は、URLから抽出されたスラッグ(記事の一意識別子)です。
- エラーハンドリング:
if (!post) {
error(404, {
message: 'Not found'
});
}
- 記事が見つからなかった場合(
post
がnull
またはundefined
の場合)、404エラーを発生させます。 error
関数は SvelteKit の機能で、HTTPステータスコードとエラーメッセージを指定できます。
- データの返却:
return { post };
- 取得した記事データをオブジェクトとして返します。
- この返却値は、対応するSvelteコンポーネントで
data.post
としてアクセスできるようになります。
この load
関数の主な目的と動作は以下の通りです:
- URLパラメータから記事のスラッグを取得する。
- そのスラッグを使用してデータベースから記事を取得する。
- 記事が存在しない場合、404エラーを発生させる。
- 記事が存在する場合、それをページコンポーネントに提供する。
この実装により、動的なコンテンツ取得と適切なエラーハンドリングが可能になり、ユーザーに適切なコンテンツまたはエラーメッセージを表示することができます。
おわりに
今日は、 SvelteKitでのエラー処理について解説しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント