You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Directus Flow能否复用自定义脚本步骤?为何不允许多入口?

在Directus Flow中复用日期校验脚本处理Create/Update场景的解决方案

核心问题拆解

你需要在item.create和item.update触发的Flow中,复用同一段start_date < end_date的校验逻辑,但Directus Flow的步骤设计为单入口,无法直接让两个不同前置路径指向同一个脚本步骤。同时两种场景的数据来源不同:

  • item.create:直接从触发事件的$trigger.payload.data获取start_date和end_date
  • item.update:需要先读取原数据,结合$trigger.payload.data中的新值,得到完整的两个日期

可行解决方案

方案1:封装全局脚本实现逻辑复用

Directus支持创建全局可复用的脚本,你可以把日期校验逻辑单独抽出来,然后在create和update两个分支的脚本步骤中调用它:

  1. 进入Settings → Scripts,创建一个全局脚本,比如命名为validate_date_range,内容如下:
// 接收包含start_date和end_date的对象
module.exports = function({ data }) {
  const { start_date, end_date } = data;
  
  if (!start_date || !end_date) {
    throw new Error('开始日期和结束日期不能为空');
  }
  
  const start = new Date(start_date);
  const end = new Date(end_date);
  
  if (start >= end) {
    throw new Error('开始日期必须早于结束日期');
  }
  
  return true;
};
  1. 在Flow中:
    • 对于item.create分支:直接添加一个Run Script步骤,调用全局脚本validate_date_range,传入参数为{ "data": $trigger.payload.data }
    • 对于item.update分支:先添加一个Read Item步骤,获取原数据的start_date和end_date,然后添加Run Script步骤,合并原数据和新数据后传入全局脚本:
      // 合并原数据和更新数据
      const combinedData = {
        ...$previous.data, // Read Item步骤的结果
        ...$trigger.payload.data
      };
      // 调用全局校验脚本
      return await runScript('validate_date_range', { data: combinedData });
      

方案2:用分支步骤统一前置逻辑,再进入同一个校验脚本

如果不想用全局脚本,也可以在Flow中通过分支判断触发类型,统一处理数据后进入同一个校验步骤:

  1. 给Flow添加两个触发事件:item.create和item.update
  2. 添加一个Branch步骤,判断$trigger.action是create还是update:
    • 当$trigger.action === 'create':直接设置一个临时变量(比如$flow.date_data)为$trigger.payload.data
    • 当$trigger.action === 'update':先执行Read Item步骤获取原数据,然后添加一个Run Script步骤,合并原数据和新数据到$flow.date_data:
      $flow.date_data = {
        ...$previous.data,
        ...$trigger.payload.data
      };
      
  3. 两个分支结束后,添加一个统一的Run Script步骤,直接使用$flow.date_data执行校验:
    const { start_date, end_date } = $flow.date_data;
    
    if (!start_date || !end_date) {
      throw new Error('开始日期和结束日期不能为空');
    }
    
    const start = new Date(start_date);
    const end = new Date(end_date);
    
    if (start >= end) {
      throw new Error('开始日期必须早于结束日期');
    }
    

关于Directus Flow单入口设计的说明

Directus Flow的步骤设计遵循线性/分支的执行模型,每个步骤只能有一个前置步骤,这是为了保证流程执行的可追踪性和逻辑清晰性——如果允许多入口,会增加流程调试的复杂度,尤其是在处理异步步骤时。但通过全局脚本或变量统一的方式,完全可以实现逻辑复用,不需要依赖多入口设计。

内容的提问来源于stack exchange,提问作者Brandon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 18:04:51