运行代码

运行代码操作可执行 JavaScript。您可以将工作流中之前步骤的数据作为输入传递到运行代码操作,并将返回值用于后续步骤。

字段

运行代码操作包含以下字段。

“运行代码”操作中使用的字段。
字段描述
输入必填。GraphQL 查询,可使用之前步骤的数据作为运行代码操作的输入。
输出必填。操作返回的数据的表示形式,以 GraphQL 模式定义语言 (SDL) 进行定义。
代码必填。运行代码操作将执行的 JavaScript。

输入数据

输入数据可传递自运行代码操作之前的步骤。若要包含此数据,您可以在输入字段中编写 GraphQL 查询。查询返回的数据将可用作被标记为 export default 的函数的 input 参数,按约定称为 main

输入查询是用于 Flow 环境数据的查询,而不是对 Shopify Admin API 的查询。因此,您不可以在输入数据中插入 Shopify 查询。此外,Flow 还可处理查询中的 edgesnodes,因此您无需向查询中添加这些或其他分页语法。

获取订单备注和订单项目标题的示例输入:

{
  order {
    note
    lineItems {
      title
    }
  }
}

此数据将被转换为可在代码中使用的 input 变量:

export default function main(input) {
  // input.order.note
  // input.order.lineItems[0].title
}

还可在函数签名中析构输入:

export default function main({order}) {
  // order.note
  // order.lineItems[0].title
}

元字段

若要访问 Run 代码中的单个元字段值,您必须先将元字段添加到 Flow 的环境数据中。此操作可以在 Run 代码外的任何操作或条件中完成。例如,您可以添加日志输出操作,然后按照说明添加元字段

将元字段添加到工作流环境后,您可以在 Run 代码中访问它。例如,假设您添加了一个订单元字段,别名为 giftMessage。然后,您可以在输入查询中访问它:

{
  order {
    giftMessage {
      value
    }
  }
}

输出数据

运行代码操作可以返回自定义数据。若要定义代码将返回的数据类型,请使用输出字段和 GraphQL 的模式定义语言 (SDL)。受支持的输出类型包括 StringIntFloat BooleanID,这些类型遵循如何指定必填字段、列表和自定义数据的 SDL 规范

例如,若要返回名为 giftMessage 的字符串和名为 totalGifts 数值,请使用:

type Output {
  "The message to include in the gift"
  giftMessage: String!
  "The total number of gifts"
  totalGifts: Int!
}

这些注释是选填的,但将用于描述 Flow UI 中的数据。若要在 JavaScript 代码中输出此数据,请返回与该类型匹配的对象:

export default function main(input) {
  // your code
  return {
    giftMessage: 'Hello',
    totalGifts: 1,
  };
}

您还可以定义自定义类型以返回更复杂的数据。例如,要返回名为 Gift 的类型,并且该类型包含名为 message 的字符串和名为 amount 的数值,请使用:

type Output {
  "The gift to send"
  gifts: [Gift!]!
}

type Gift {
  "The message to include in the gift"
  message: String!
  "The total number of gifts"
  amount: Int!
}

若要在此操作后的步骤中访问此数据,请使用名为 Run code 的变量,系统将根据在运行代码操作配置中定义的 Output 架构来设置其类型。您可在条件和操作中使用此变量。

console.log

您可以使用 console.log 将数据输出到 Flow 的工作流运行日志,以便进行故障排除。输出将在工作流的“运行日志”中显示。例如,以下内容有效:

export default function main(input) {
  console.log('Hello, world!');
  //Hello, world!
  console.log(input);
  // { order: { note: 'Hello', lineItems: [{ title: 'World' }] } }
  console.log(input.order, 'is the order');
  // { note: 'Hello', lineItems: [{ title: 'World' }] }
  // is the order

  return {
    giftMessage: 'Hello',
    totalGifts: 1,
  };
}

您不能在运行代码操作中使用 console.infoconsole.error 或其他函数。

示例

可在 Flow 示例储存库中找到运行代码操作的示例。

限制

运行代码操作具有以下限制:

  • “运行代码”操作支持 ECMA2020 JavaScript。它不支持 NodeJS 或 CommonJS API,或导入模块。
  • 您的代码无法进行 http 调用 (fetch)。
  • 不能使用随机和基于时钟的函数。日期数据(例如 scheduledAtcreatedAt )可以作为输入传入。
  • console.log 不会登录浏览器控制台。
  • 您无法直接在 Run 代码操作中添加元字段别名。请查看元字段部分,了解如何完成此操作。

此外,还存在以下强制限制:

  • 输入数据查询限制为 5000 个字符。
  • 输出数据架构限制为 5000 个字符。
  • 输出数据有效负载和 console.log 输出的合计大小限制为 50 kb。
  • 代码不能超过 50000 个字符。
  • 总执行时长限制为 5 秒。
  • 内存用量限制为 10 MB。

路线图

Flow 团队计划逐步为运行代码操作添加功能。下表概述了计划的改进以及预计交付日期。

运行代码操作的改进路线图
改进描述预计送达时间
日志记录使用 `console.log` 将数据输出到“运行”日志以进行故障排除。已交付。
外部 API 调用使用 JavaScript 的 fetch 来调用 API。2025 年第 1 季度

模板

在新订单中添加免费(100% 折扣)商品

此模板会在新订单中添加免费折扣商品(如有库存)。它检查库存,应用 100% 折扣,并在不通知客户的情况下更新订单。此自动化有助于 (1) 通过在订单中添加免费惊喜商品来提高客户满意度,(2) 通过在订单中添加免费样品来推广新产品或不知名的产品,或者 (3) 通过自动包含免费商品并应用折扣来简化促销。查看模板

取消不活跃退货

自动取消在一定时间内未退款或未重新入库的退货。查看模板

使用“运行代码”操作将带前缀的标签转换为产品元字段

此工作流会将以“color:”等前缀开头的标签添加到产品元字段列表中。它使用“运行代码”操作解析标签和元字段列表中的现有商品。此工作流在创建产品时运行,但也可以在现有产品上手动运行。查看模板

当客户订购多个产品多属性时发送通知

当客户订购同一产品的多个属性时,接收电子邮件通知。查看模板

在订单包含产品套装时发送通知

创建订单后会启动此工作流,并检查订单中任何产品是否作为产品套装的一部分购买。如果找到,系统会发送包含套装详细信息的内部电子邮件。此外,您还可以使用此工作流作为任何用例的起点,这些用例需要检测订单中是否存在套装。查看模板

使用关联的 UTM 宣传活动标记订单

向包含任何相关 UTM 宣传活动名称的订单添加标签。查看模板

没有找到您需要的答案?我们将为您提供帮助。