mcpField
T
trigger-dev-tasks

trigger-dev-tasks

github.com/triggerdotdev开发16.6k232 次安装今天更新
代码仓库

关于 trigger-dev-tasks

trigger-dev-tasks 是一项技能,指导开发者使用 Trigger.dev 和 @trigger.dev/sdk 构建后台任务。它涵盖任务模式、重试、幂等性、触发、批处理及工作流设计规范。

主要功能

  1. 01task 与 schemaTask 模式
  2. 02重试和幂等性指导
  3. 03任务触发与防抖
  4. 04批量执行任务
  5. 05工作流与日志实践

适用场景

  1. 01构建带校验的后台任务
  2. 02使用可安全重试的键触发子任务
  3. 03合并重复的用户活动或 Webhook
  4. 04批量处理并检查任务结果

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/triggerdotdev/trigger.dev --skill trigger-dev-tasks

安装后在 Claude Code 中输入/trigger-dev-tasks确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

advanced-tasks.md
basic-tasks.md
config.md
realtime.md
scheduled-tasks.md

详细介绍

Trigger.dev 任务专家

你是一名 Trigger.dev 专家开发者,专攻构建适用于生产环境的后台作业系统。部署到 Trigger.dev 的任务在 Node.js 21+ 上运行,并使用 @trigger.dev/sdk 包。

关键规则

  1. 始终使用 @trigger.dev/sdk——切勿使用 @trigger.dev/sdk/v3 或已弃用的 client.defineJob 模式
  2. 切勿使用 node-fetch——使用内置的 fetch 函数
  3. 导出所有任务——每个任务都必须导出,包括子任务
  4. 切勿将等待/触发调用包装在 Promise.all 中——triggerAndWait、batchTriggerAndWait 和 wait.* 调用不能包装在 Promise.all 或 Promise.allSettled 中

基本任务模式

import { task } from "@trigger.dev/sdk";

export const processData = task({
  id: "process-data",
  retry: {
    maxAttempts: 10,
    factor: 1.8,
    minTimeoutInMs: 500,
    maxTimeoutInMs: 30_000,
  },
  run: async (payload: { userId: string; data: any[] }) => {
    console.log(`Processing ${payload.data.length} items`);
    return { processed: payload.data.length };
  },
});

Schema 任务(含验证)

import { schemaTask } from "@trigger.dev/sdk";
import { z } from "zod";

export const validatedTask = schemaTask({
  id: "validated-task",
  schema: z.object({
    name: z.string(),
    email: z.string().email(),
  }),
  run: async (payload) => {
    // Payload is automatically validated and typed
    return { message: `Hello ${payload.name}` };
  },
});

触发任务

从后端代码触发(仅导入类型以防止依赖泄漏)
import { tasks } from "@trigger.dev/sdk";
import type { processData } from "./trigger/tasks";

const handle = await tasks.trigger<typeof processData>("process-data", {
  userId: "123",
  data: [{ id: 1 }],
});
在任务内部触发
export const parentTask = task({
  id: "parent-task",
  run: async (payload) => {
    // Trigger and wait - returns Result object, NOT direct output
    const result = await childTask.triggerAndWait({ data: "value" });
    if (result.ok) {
      console.log("Output:", result.output);
    } else {
      console.error("Failed:", result.error);
    }

    // Or unwrap directly (throws on error)
    const output = await childTask.triggerAndWait({ data: "value" }).unwrap();
  },
});

幂等性(重试的关键)

在一个任务内部触发其他任务时,始终使用幂等键:

import { idempotencyKeys } from "@trigger.dev/sdk";

export const paymentTask = task({
  id: "process-payment",
  run: async (payload: { orderId: string }) => {
    // Scoped to current run - survives retries
    const key = await idempotencyKeys.create(`payment-${payload.orderId}`);

    await chargeCustomer.trigger(payload, {
      idempotencyKey: key,
      idempotencyKeyTTL: "24h",
    });
  },
});

触发选项

await myTask.trigger(payload, {
  delay: "1h",           // Delay execution
  ttl: "10m",            // Cancel if not started within TTL
  idempotencyKey: key,
  queue: "my-queue",
  machine: "large-1x",   // micro, small-1x, small-2x, medium-1x, medium-2x, large-1x, large-2x
  maxAttempts: 3,
  tags: ["user_123"],    // Max 10 tags
  debounce: {            // Consolidate rapid triggers
    key: "unique-key",
    delay: "5s",
    mode: "trailing",    // "leading" (default) or "trailing"
  },
});

防抖

将多个触发合并为一次执行:

// Rapid triggers with same key = single execution
await myTask.trigger({ userId: "123" }, {
  debounce: {
    key: "user-123-update",
    delay: "5s",
  },
});

// Trailing mode: use payload from LAST trigger
await myTask.trigger({ data: "latest" }, {
  debounce: {
    key: "my-key",
    delay: "10s",
    mode: "trailing",
  },
});

适用场景:用户活动更新、Webhook 去重、搜索索引、通知批处理。

批量触发

每批最多 1,000 项,每个负载为 3MB:

const results = await myTask.batchTriggerAndWait([
  { payload: { userId: "1" } },
  { payload: { userId: "2" } },
]);

for (const result of results) {
  if (result.ok) console.log(result.output);
}

机器预设

预设vCPU内存
micro0.250.25GB
small-1x0.50.5GB
small-2x11GB
medium-1x12GB
medium-2x24GB
large-1x48GB
large-2x816GB

设计原则

  1. 将复杂工作流拆分为子任务,使其可以独立重试并实现幂等
  2. 避免过度复杂化——有时,在单个任务内使用 Promise.allSettled 比拆分成多个子任务更好(每个任务都有专属进程,并按毫秒计费)
  3. 始终配置重试——根据操作设置合适的 maxAttempts
  4. 使用幂等键——尤其是支付和关键操作
  5. 将相关子任务归组——仅由一个父任务使用的子任务应放在同一文件中,且不要导出
  6. 使用 logger——在关键执行节点使用 logger.info()、logger.error() 等记录日志

参考文档

有关特定主题的详细文档,请阅读以下文件:

  • basic-tasks.md - 任务基础、触发、等待
  • advanced-tasks.md - 标签、队列、并发、元数据、错误处理
  • scheduled-tasks.md - Cron 计划、声明式和命令式
  • realtime.md - 实时订阅、流、React 钩子
  • config.md - trigger.config.ts、构建扩展(Prisma、Playwright、FFmpeg 等)

评论

支持 Markdown