Hooks
Edit this page on GitHubオプションの src/hooks.js
(または src/hooks.ts
、または src/hooks/index.js
) ファイルはサーバー上で実行される4つの関数 — handle
、handleError
、getSession
、externalFetch
— をエクスポートできます。全てオプションです。
このファイルの配置場所は コンフィグ の
config.kit.files.hooks
で変更することができます。
handlepermalink
この関数は SvelteKit のサーバーが リクエスト を受けるたびに (アプリの実行中であろうと、プリレンダリングであろうと) 実行され、レスポンス を決定します。リクエストを表す event
オブジェクトと、SvelteKitのルーターを呼び出しそれに応じて(ページをレンダリングしたり、エンドポイントを呼び出したりして)レスポンスを生成する resolve
という関数を受け取ります。これにより、レスポンスのヘッダーやボディを変更したり、SvelteKitを完全にバイパスすることができます (例えば、プログラムでエンドポイントを実装する場合など)。
src/hooks.js
ts
export async functionhandle ({event ,resolve }) {if (event .url .pathname .startsWith ('/custom')) {return newResponse ('custom response');}constresponse = awaitresolve (event );returnresponse ;}
静的アセット(プリレンダリング済みのページを含む)に対するリクエストは SvelteKit では処理されません。
未実装の場合、デフォルトでは ({ event, resolve }) => resolve(event)
となります。カスタムデータをリクエストに追加してエンドポイントに渡すには、以下のように event.locals
オブジェクトにデータを追加します。
src/hooks.js
ts
export async functionhandle ({event ,resolve }) {event .locals .user = awaitgetUserInformation (event .request .headers .get ('cookie'));constresponse = awaitresolve (event );response .headers .set ('x-custom-header', 'potato');returnresponse ;}
sequence
ヘルパー関数を使用すると、複数の handle
関数呼び出しを追加することができます。
resolve
はオプションの第2引数をサポートしており、レスポンスのレンダリング方法をより詳細にコントロールすることができます。そのパラメータは、以下のフィールドを持つオブジェクトです:
ssr: boolean
(defaulttrue
) —false
の場合、サーバーサイドレンダリングする代わりに空の 'shell' ページをレンダリングしますtransformPage(opts: { html: string }): string
— カスタムの変換を HTML に適用します
src/hooks.js
ts
export async functionhandle ({event ,resolve }) {constresponse = awaitresolve (event , {ssr : !event .url .pathname .startsWith ('/admin'),transformPage : ({html }) =>html .replace ('old', 'new')});returnresponse ;}
サーバーサイドレンダリング を無効にすると、SvelteKit アプリは事実上 シングルページアプリ または SPA になります。ほとんどの場合、これは推奨されません (appendix を参照)。無効にすることが本当に適切かどうかを検討し、すべてのリクエストに対して無効にするのではなく、選択的に無効にしてください。
handleErrorpermalink
もしレンダリング中にエラーがスローされたら、error
とそれを引き起こした event
を引数にこの関数が呼び出されます。これによってデータをエラートラッキングサービスに送ったり、エラーをコンソールに出力する前にフォーマットをカスタマイズしたりすることができます。
開発中、もし Svelte コードで構文エラーが発生した場合、エラー場所をハイライトする frame
プロパティが追加されます。
未実装の場合、SvelteKitはデフォルトのフォーマットでエラーをログ出力します。
src/hooks.js
ts
export async functionhandleError ({error ,event }) {// example integration with https://sentry.io/Sentry .captureException (error , {event });}
handleError
は例外がキャッチされていない場合にのみ呼び出されます。ページやエンドポイントが明示的に 4xx や 5xx ステータスコードで応答した場合は呼び出されません。
getSessionpermalink
この関数は、event
オブジェクトを引数に取り、クライアントからアクセス可能な session
オブジェクトを返します。つまり session
オブジェクトはユーザーに公開しても安全なものでなければなりません。この関数はSvelteKitがページをサーバーレンダリングする際に実行されます。
未実装の場合、session は {}
です。
src/hooks.js
ts
export functiongetSession (event ) {returnevent .locals .user ? {user : {// only include properties needed client-side —// exclude anything else attached to the user// like access tokens etcname :event .locals .user .name ,event .locals .user .avatar :event .locals .user .avatar }}: {};}
session
はシリアライズ可能でなければなりません。つまり、関数やカスタムクラスなどを含んではならず、JavaScriptの組み込みデータ型だけでなければいけません
externalFetchpermalink
この関数によって、サーバー上で (またはプリレンダリング中に) 実行される load
関数の中で発生する、外部リソースへの fetch
リクエストを変更 (または置換) することができます。
例えば、ユーザーがクライアントサイドで https://api.yourapp.com
のようなパブリックなURLに移動をするときには、load
関数でそのURLにリクエストを行うかもしれません。しかしSSRでは、(パブリックなインターネットとの間にあるプロキシーやロードバランサーをバイパスして) 直接 API にアクセスするほうが理にかなっている場合があります。
ts
export async functionexternalFetch (request ) {if (request .url .startsWith ('https://api.yourapp.com/')) {// clone the original request, but change the URLrequest = newRequest (request .url .replace ('https://api.yourapp.com/', 'http://localhost:9999/'),request );}returnfetch (request );}