Shopify Functions

Shopify Function 禁用随机数与时间

现象#

函数里用 Date.now() 判断活动是否开始,部署后运行直接失败;改成 Math.random() 做抽奖又报同一类错误,日志里只剩一行堆栈。

原因#

  • 函数要求确定性,平台禁止随机与时钟调用,同一 input 必须得到同一 output
  • 沙箱没有网络与文件系统,fetch、fs.readFileSync 在运行阶段就不可用
  • 活动时间不能取当前时间,只能由外部写入 metafield 或购物车属性再读取
  • 日志只保留 1 kB,超出部分被截断,异常看起来像没有原因

处理步骤#

  1. 删掉 Date.now()、new Date() 与 Math.random()
  2. 把活动起止时间写进 $app:promo 的 metafield,用固定时间戳比较
  3. 按批次分流时用 variant id 哈希取模,代替随机数
  4. 外部数据预写入 metafield,函数内不发 fetch、不读文件
  5. 用同一条 input 连跑两次,确认两次 output 逐字节一致

验收标准#

同一 fixture 连续两次回放的 output 完全一致,函数不再因禁用 API 失败,活动切换只随 metafield 值变化。

本文由 风格技术 技术团队整理,适用于 Shopify 标准版与 Plus 店铺。Shopify 平台能力迭代较快,具体操作路径与字段以官方文档和店铺后台实际版本为准。