You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:56:24