4 JavaScript 预处理

概述

本节提供 JavaScript 预处理的详细信息。

JavaScript 预处理

JavaScript 预处理是通过调用具有单个参数“值”和用户提供的函数体的 JavaScript 函数来完成的。 预处理步骤的结果是从这个函数返回的值,例如,要执行华氏到摄氏度的转换,用户必须输入:

  1. return (value - 32) * 5 / 9

在 JavaScript 预处理参数中,将被服务器包装成一个 JavaScript 函数:

  1. function (value)
  2. {
  3. return (value - 32) * 5 / 9
  4. }

输入参数“值”始终作为字符串传递。 返回值通过 ToString() 方法自动强制转换为字符串(如果失败,则错误作为字符串值返回),但有一些例外:

  • 返回未定义的值将导致错误
  • 返回空值将导致输入值被丢弃,很像“Custom on fail”操作中的“丢弃值”预处理。

可以通过抛出值/对象(通常是字符串或错误对象)来返回错误。

例子:

  1. if (value == 0)
  2. throw "Zero input value"
  3. return 1/value

每个脚本都有 10 秒的执行超时(根据脚本的不同,触发超时可能需要更长的时间); 超过它会返回错误。 强制执行 64 兆字节的堆限制。

JavaScript 预处理步骤字节码被缓存并在下次应用该步骤时重用。 对监控项预处理步骤的任何更改都将导致缓存的脚本被重置并稍后重新编译。

连续运行时失败(连续 3 次)将导致引擎重新初始化,以减少一个脚本破坏下一个脚本的执行环境的可能性(此操作使用 DebugLevel 4 及更高级别记录)。

JavaScript 预处理是用 Duktape 实现的 (https://duktape.org/) JavaScript 引擎。

参考: 另外的 JavaScript 对象和全局函数

在脚本中使用宏

可以在 JavaScript 代码中使用用户宏。 如果脚本包含用户宏,则这些宏在执行特定预处理步骤之前由服务器/代理解析。 注意,在前端测试预处理步骤时,宏值不会被拉取,需要手动输入。

将宏替换为其值时将忽略上下文。宏值按原样插入代码中,在将值放入 JavaScript 代码之前无法添加额外的转义。请注意,这可能在某些情况下会导致 JavaScript 错误 。

在下面的示例中,如果接收到的值超过 {$THRESHOLD} 宏值,则将返回阈值(如果存在):

  1. var threshold = '{$THRESHOLD}';
  2. return (!isNaN(threshold) && value > threshold) ? threshold : value;