创建触发器

本教程将指导你为 Gelato Piece 创建一个监听新冰淇淋口味的触发器。

触发器定义

运行以下命令创建触发器:

npm run cli triggers create
  1. Piece 文件夹名称:与触发器所在文件夹关联的名称。有助于在 Piece 内组织和分类触发器。
  2. 触发器显示名称:用户在界面中看到的名称,清晰传达触发器的用途。
  3. 触发器描述:在 UI 中显示的简短说明信息,指导用户了解触发器的功能和目的。
  4. 触发器技术:指定触发器类型——轮询Webhook

示例:

npm run cli triggers create

? 请输入 piece 文件夹名称:gelato
? 请输入触发器显示名称:new flavor created
? 请输入触发器描述:当创建新冰淇淋口味时触发。
? 请选择触发器技术:polling

这将在 packages/pieces/community/gelato/src/lib/triggers 目录下创建一个名为 new-flavor-created.ts 的新 TypeScript 文件。

在该文件中粘贴以下代码:

import { gelatoAuth } from '../../';
import {
  DedupeStrategy,
  HttpMethod,
  HttpRequest,
  Polling,
  httpClient,
  pollingHelper,
} from '@activepieces/pieces-common';
import {
  TriggerStrategy,
  createTrigger,
  AppConnectionValueForAuthProperty
} from '@activepieces/pieces-framework';
import dayjs from 'dayjs';

const polling: Polling<
  AppConnectionValueForAuthProperty<typeof gelatoAuth>,
  Record<string, never>
> = {
  strategy: DedupeStrategy.TIMEBASED,
  items: async ({ auth, propsValue, lastFetchEpochMS }) => {
    const request: HttpRequest = {
      method: HttpMethod.GET,
      url: 'https://cloud.activepieces.com/api/v1/webhooks/aHlEaNLc6vcF1nY2XJ2ed/sync',
      headers: {
        authorization: auth,
      },
    };
    const res = await httpClient.sendRequest(request);
    return res.body['flavors'].map((flavor: string) => ({
      epochMilliSeconds: dayjs().valueOf(),
      data: flavor,
    }));
  },
};

export const newFlavorCreated = createTrigger({
  auth: gelatoAuth,
  name: 'newFlavorCreated',
  displayName: '新口味已创建',
  description: '当创建新冰淇淋口味时触发。',
  props: {},
  sampleData: {},
  type: TriggerStrategy.POLLING,
  async test(context) {
    return await pollingHelper.test(polling, context);
  },
  async onEnable(context) {
    const { store, auth, propsValue } = context;
    await pollingHelper.onEnable(polling, { store, auth, propsValue });
  },

  async onDisable(context) {
    const { store, auth, propsValue } = context;
    await pollingHelper.onDisable(polling, { store, auth, propsValue });
  },

  async run(context) {
    return await pollingHelper.poll(polling, context);
  },
});

轮询触发器的工作方式通常如下:

Run:run 方法每 5 分钟执行一次,从端点获取指定时间戳范围内的数据,或持续遍历直到找到最后一个项目 ID。然后以数组形式返回新项目。在此示例中,使用 httpClient.sendRequest 方法获取新口味,随后将其与时间戳一起存入存储中。

暴露定义

要使触发器能被 Activepieces 识别,请将其添加到 Piece 定义的 triggers 数组中。

import { createPiece } from '@activepieces/pieces-framework';
import { getIcecreamFlavor } from './lib/actions/get-icecream-flavor';
// 不要忘记添加以下导入。
import { newFlavorCreated } from './lib/triggers/new-flavor-created';

export const gelato = createPiece({
  displayName: 'Gelato 教程',
  logoUrl: 'https://cdn.activepieces.com/pieces/gelato.png',
  authors: [],
  auth: gelatoAuth,
  actions: [getIcecreamFlavor],
  // 在此处添加触发器。
  triggers: [newFlavorCreated], // <--------
});

测试

默认情况下,开发环境只构建特定的组件。打开 .env.dev 文件,在 AP_DEV_PIECES 中添加 “gelato”。

更多详情请查看 Piece 开发 部分。

编辑环境变量后,重新启动后端。Piece 将被重新构建。之后,你需要刷新前端才能看到更改。

要测试触发器,请在 Activepieces 中使用工作流构建器加载示例数据。其运行效果应如截图所示。

要使你的 Webhook 可从互联网访问,你需要将本地开发实例暴露到互联网,请执行以下操作:
  1. 安装 localxpose
  2. 按照文档启动第一个指向 localhost:4200 的隧道。
  3. 复制隧道域名,例如 wozcsvaint.loclx.io,并将 .env.dev 中的 AP_FRONTEND_URL 环境变量替换为暴露的 URL,例如 https://wozcsvaint.loclx.io
  4. 前往 /packages/web/vite.config.ts,取消注释 allowedHosts 并将值替换为相同的隧道域名,例如 wozcsvaint.loclx.io。

完成这些配置后,你将能够测试 Webhook 触发器和运行包含它们的已发布工作流。

Gelato 动作