运行代码

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

字段

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

“运行代码”操作中使用的字段。
字段描述
输入必需。一个 GraphQL 查询,用于将之前步骤中的数据用作运行代码操作的输入。
输出必需。要通过操作返回的数据的表示形式,在 GraphQL 的架构定义语言 (SDL) 中定义。
代码必需。运行代码操作将执行的 JavaScript。

输入数据

输入数据可以从运行代码操作之前的步骤传递。若要包含此数据,您可以在输入字段中编写 GraphQL 查询。从该查询返回的数据将作为标记为 export default 的函数(按惯例称为 main)的 input 参数提供。

输入查询是针对 Shopify Flow 环境数据的查询,而不是针对 Shopify Admin API 的查询。因此,您无法在输入数据中插入 Shopify 查询。此外,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
}

元字段

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

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

{
  order {
    giftMessage {
      value
    }
  }
}

输出数据

运行代码操作可以返回自定义数据。若要定义代码将返回的数据类型,请使用输出字段和 GraphQL 的 架构定义语言 (SDL)。支持的输出类型包括 `String`、`Int`、`Float`、`Boolean` 和 `ID`,它们遵循 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!
}

若要在此操作之后的步骤中访问此数据,请使用名为运行代码的变量,该变量将根据您在运行代码操作配置中定义的 `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.info`、`console.error` 或其他函数。

示例

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

限制

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

  • 运行代码操作支持 ECMA2020 JavaScript。它不支持 NodeJS 或 CommonJS API,也不支持导入模块。
  • 您的代码无法发出 HTTP 调用 (`fetch`)。
  • 无法使用随机函数和基于时钟的函数。日期数据(例如 `scheduledAt` 或 `createdAt`)可以作为输入传入。
  • Console.log 不会将日志记录到浏览器控制台。
  • 为了节省负载大小,输出数据负载仅返回在下游步骤中使用的变量。
  • 您无法在运行代码操作中直接添加元字段别名。若要实现此目的,请查看此页面上的元字段部分

此外,还强制执行以下限制:

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

模板

为新订单添加免费(享受 100% 折扣)的商品

此模板可在商品有货时向新订单添加免费的折扣商品。它会检查库存、应用 100% 的折扣并更新订单,而不会通知客户。此工作流可帮助为以下场景添加自动化功能:

  • 通过在客户订单中加入意想不到的免费商品来提高客户满意度。
  • 通过将新产品或知名度较低的产品作为免费样品添加到订单中来进行推广。
  • 通过自动添加免费商品和提供折扣来简化促销活动。

查看模板

取消不活跃的退货

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

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

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

在客户订购一款产品的多种多属性时发送通知

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

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

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

为订单添加关联的 UTM 宣传活动标记

为订单添加包含任何关联的 UTM 宣传活动名称的标记。查看模板