Shopify Function 禁用随机数与时间
现象#
函数里用 Date.now() 判断活动是否开始,部署后运行直接失败;改成 Math.random() 做抽奖又报同一类错误,日志里只剩一行堆栈。
原因#
- 函数要求确定性,平台禁止随机与时钟调用,同一 input 必须得到同一 output
- 沙箱没有网络与文件系统,fetch、fs.readFileSync 在运行阶段就不可用
- 活动时间不能取当前时间,只能由外部写入 metafield 或购物车属性再读取
- 日志只保留 1 kB,超出部分被截断,异常看起来像没有原因
处理步骤#
- 删掉
Date.now()、new Date()与Math.random() - 把活动起止时间写进
$app:promo的 metafield,用固定时间戳比较 - 按批次分流时用
variant id哈希取模,代替随机数 - 外部数据预写入 metafield,函数内不发
fetch、不读文件 - 用同一条 input 连跑两次,确认两次 output 逐字节一致
验收标准#
同一 fixture 连续两次回放的 output 完全一致,函数不再因禁用 API 失败,活动切换只随 metafield 值变化。
本文由 风格技术 技术团队整理,适用于 Shopify 标准版与 Plus 店铺。Shopify 平台能力迭代较快,具体操作路径与字段以官方文档和店铺后台实际版本为准。