javascript APIGEE -不支持解构声明中的默认值

zbwhf8kr  于 2023-09-29  发布在  Java
关注(0)|答案(1)|浏览(126)

我写了一个JavaScript来验证客户端IP是否在白名单IP范围内。我弄错了
编译JavaScript jsc://ApiKeyPathValidator.js失败,错误为:编译错误:不支持解构声明中的默认值(ApiKeyPathValidator#323)。行:323,列:23。源代码为:const [range,bits = 32] = cidr.split('/')
下面的JavaScript代码

const ip4ToInt = ip =>
  ip.split('.').reduce((int, oct) => (int << 8) + parseInt(oct, 10), 0) >>> 0;

const isIp4InCidr = ip => cidr => {
  const [range, bits = 32] = cidr.split('/');
  const mask = ~(2 ** (32 - bits) - 1);
  return (ip4ToInt(ip) & mask) === (ip4ToInt(range) & mask);
};

var whitelistedCidr=['10.0.0.1', '10.1.1.1/21','10.0.0.1'];
var clientIp=getEnv("request.header.X-Forwarded-For");

const isIp4InCidrs = (ip, cidrs) => cidrs.some(isIp4InCidr(ip));
var isInRange=false;
isInRange=isIp4InCidrs(clientIp, whitelistedCidr); 
console.log("Whitelisted IP Test");
console.log(isInRange);
5hcedyr0

5hcedyr01#

  • “不支持解构声明中的默认值”* 是在告诉你,你在这里使用的语法不受支持:
const [range, bits = 32 ] = cidr.split('/');

const [range, bits = 32]部分是一个解构声明,而= 32部分是一个默认值。
这是完全有效的JavaScript语法,但显然您正在使用的工具不支持它。用老方法来做吧:

const parts = cidr.split('/');
const range = parts[0];
const bits = parts[1] ?? 32;

(如果该工具也不支持??,您可以使用const bits = 1 in parts ? parts[1] : 32;const bits = parts[1] || 32;,这取决于您将如何使用bits
旁注:split的结果总是一个字符串的数组,所以对于你的代码(以及上面的修改版本),在某些情况下,你的bits常量将包含一个字符串,而其他时候它将包含一个数字(32)。通常,最好始终使用其中一个,如果提供的话,可以将parts[1]解析为number。

相关问题