Azure Stream Analytics自定义JS UDF实现Base64解码及函数权限问询
关于Azure Stream Analytics自定义JS UDF实现Base64解码的问题解答
首先直接给你明确结论:
- Azure Stream Analytics 支持使用自定义JavaScript UDF进行Base64解码
- 自定义JS函数并非完全无限制:ASA的JS运行时基于ECMAScript 5.1标准,仅支持通用的JS内置对象与方法,浏览器专属API(比如你尝试的
atob())不在支持范围内,这就是你触发报错的核心原因。
为什么atob()会报错?
atob()是浏览器环境特有的Base64解码API,而ASA的JS UDF运行在服务器端的受限执行环境中,并没有集成这类浏览器专属方法,因此会抛出ReferenceError: 'atob' is not defined的异常。
解决方案:用标准JS实现Base64解码
你可以使用原生JS编写兼容ECMAScript 5.1的Base64解码函数,替代atob()。以下是可直接使用的UDF代码:
function main(input) { var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; var output = ""; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (i < input.length) { enc1 = keyStr.indexOf(input.charAt(i++)); enc2 = keyStr.indexOf(input.charAt(i++)); enc3 = keyStr.indexOf(input.charAt(i++)); enc4 = keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } } return output; }
验证你的示例数据
你提供的示例中Body字段值为eyJ0ZW1wIjoxLjc1LCJodW0iOjYxLjYzLCJyc3NpIjotMTAzLCJzbnIiOjguMn0=,用上述UDF解码后会得到:
{"temp":1.75,"hum":61.63,"rssi":-103,"snr":8.2}
优化你的查询(可选)
如果需要直接提取解码后JSON中的字段,可以结合JSON_VALUE函数使用,让查询更高效:
SELECT [SystemProperties].[connectionDeviceId], JSON_VALUE(UDF.base64decod(Body), '$.temp') AS temp, JSON_VALUE(UDF.base64decod(Body), '$.hum') AS hum, JSON_VALUE(UDF.base64decod(Body), '$.rssi') AS rssi, JSON_VALUE(UDF.base64decod(Body), '$.snr') AS snr, EventProcessedUtcTime INTO [intoData] FROM [fromBlob]
关于ASA自定义JS UDF的补充说明
- 支持特性:遵循ECMAScript 5.1标准,支持
String、Number、Array等通用内置对象的核心方法 - 不支持特性:浏览器专属API(如
atob/btoa)、ES6+语法(如箭头函数、let/const)、DOM操作相关方法
内容的提问来源于stack exchange,提问作者Cat
相关产品推荐
相关产品推荐

