APIGEE环境下JS验证IP白名单遇解构默认值不支持编译错误求助
解决JavaScript CIDR验证代码的编译错误
你的编译错误根源是当前使用的jsc引擎不支持数组解构赋值中的默认值语法(也就是你代码里const [range, bits = 32] = cidr.split('/')这行写法)。下面是修复后的代码和说明:
修复方案
把解构赋值的代码替换为手动处理拆分后的结果,手动设置默认值,兼容老版本JS引擎:
const ip4ToInt = ip => ip.split('.').reduce((int, oct) => (int << 8) + parseInt(oct, 10), 0) >>> 0; const isIp4InCidr = ip => cidr => { // 替换原来的解构默认值写法,手动处理拆分结果 const parts = cidr.split('/'); const range = parts[0]; // 若没有指定子网位,默认用32,同时确保bits是数字类型 const bits = parts[1] ? parseInt(parts[1], 10) : 32; 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);
说明
- 拆分CIDR字符串后,通过判断
parts[1]是否存在来决定子网位数值,不存在则使用默认的32 - 用
parseInt(parts[1], 10)确保子网位是数字类型,避免后续位运算出现字符串拼接的错误
内容的提问来源于stack exchange,提问作者Ikigai11
相关产品推荐
相关产品推荐

