mcpField
S
safe-action-advanced

safe-action-advanced

github.com/next-safe-action開発11.2k 回インストール8 週間前に更新
リポジトリ

safe-action-advanced について

サーバーアクションの設定、フレームワークエラーの処理、型付きメタデータや型推論に対応する next-safe-action の高度な機能です。基本的なアクションフローを超える制御が必要な開発者向けです。

主な機能

  1. 01アクションへの追加引数のバインド
  2. 02型付きメタデータの付与
  3. 03フレームワークエラーの処理
  4. 04アクションとミドルウェアの型推論
  5. 05サーバー側コールバックの設定

活用シーン

  1. 01リソース ID をアクションに渡す
  2. 02ミドルウェアでメタデータを使う
  3. 03リダイレクトや認可エラーの処理
  4. 04処理済みサーバーエラーの再スロー

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/next-safe-action/skills --skill safe-action-advanced

インストール後、Claude Code で/safe-action-advancedを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

bind-arguments.md
framework-errors.md
metadata.md
type-utilities.md

詳細

next-safe-action の高度な機能

概要

機能ユースケース
引数のバインド.bind() を使ってアクションに追加の引数(リソース ID など)を渡します
メタデータミドルウェアで使用する型付きメタデータをアクションに付与します
フレームワークエラーアクション内で redirect、notFound、forbidden、unauthorized を処理します
型ユーティリティアクション関数とミドルウェアから型を推論します

サーバーレベルのアクションコールバック

.action() の第 2 引数では、サーバー上で(クライアント側のフックではなく)実行されるコールバックを指定できます。

export const createPost = authActionClient
  .inputSchema(schema)
  .action(
    async ({ parsedInput, ctx }) => {
      const post = await db.post.create(parsedInput);
      return post;
    },
    {
      onSuccess: async ({ data, parsedInput, ctx, metadata, clientInput }) => {
        // Runs on the server after successful execution
        await invalidateCache("posts");
      },
      onError: async ({ error, metadata, ctx, clientInput, bindArgsClientInputs }) => {
        // error: { serverError?, validationErrors? }
        await logError(error);
      },
      onSettled: async ({ result }) => {
        // Always runs
        await recordMetrics(result);
      },
      onNavigation: async ({ navigationKind }) => {
        // Runs when a framework error (redirect, notFound, etc.) occurs
        console.log("Navigation:", navigationKind);
      },
    }
  );

これらはフックのコールバック(useAction({ onSuccess }))とは別のものです。サーバーコールバックは Node.js ランタイムで実行され、フックのコールバックはブラウザーで実行されます。

throwServerError

サーバーエラーを result.serverError として返す代わりに、再スローします。

export const myAction = actionClient
  .inputSchema(schema)
  .action(serverCodeFn, {
    throwServerError: true,
    // The handled server error (return of handleServerError) is thrown
  });

これを returnServerError() と混同しないでください。throwServerError は、handleServerError で処理された後のエラーを返すのではなく、スローします。一方、returnServerError(payload) は handleServerError を完全に迂回して、型付きの予期されるエラーを result.serverError として返します(safe-action-client スキルのエラー処理に関するドキュメントを参照)。

コメント