mcpField
S
safe-action-advanced

safe-action-advanced

github.com/next-safe-action开发11.2k 次安装8 周前更新
代码仓库

关于 safe-action-advanced

next-safe-action 的进阶功能,涵盖服务端 action 配置、框架错误处理、类型化元数据和类型推断,适用于需要基础操作流程之外控制能力的开发者。

主要功能

  1. 01为 action 绑定额外参数
  2. 02附加类型化元数据
  3. 03处理框架错误
  4. 04推断 action 与中间件类型
  5. 05配置服务端回调

适用场景

  1. 01向 action 传递资源 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() 的第二个参数接受在服务端运行的回调(不是客户端钩子):

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) 则会在 result.serverError 中返回一个类型化的预期错误,并完全绕过 handleServerError(请参阅 safe-action-client 技能中的错误处理文档)。

评论

支持 Markdown