BigQuery JavaScript自定义函数创建求助:语法错误排查
修正BigQuery临时JS UDF加密MSISDN的问题
核心错误与修复要点
- 参数名非法:原函数用
const作为参数名,const是JavaScript保留关键字,直接导致语法错误,需改为合法变量名(比如msisdn)。 - 数据类型误用:MSISDN是带前导0的字符串,用
FLOAT64会丢失前导0,参数和返回类型都应改为STRING。 - 不支持Node.js模块:BigQuery JS UDF运行环境基于浏览器,无法使用Node.js的
require('crypto'),需改用Web Crypto API实现加密逻辑。 - IV长度不合法:AES-256-CBC要求IV必须是16字节,原IV仅3字节,需调整为16字节的有效值。
- 未执行加密逻辑:原JS代码仅定义了
encrypt函数但未调用,需在UDF中直接执行并返回结果。
修正后的完整代码
CREATE TEMPORARY FUNCTION encryption(msisdn STRING) RETURNS STRING LANGUAGE js AS """ async function encrypt(input) { // 加密配置,注意IV必须为16字节 const encryptionConfig = { password: "abc", salt: "xyz123", iv: "abcdefghijklmnop", // 16字节长度的IV iterationCount: 783923, algorithm: "AES-CBC", keyLength: 256, // 对应AES-256加密 keyShaAlg: "SHA-256" }; // 基于PBKDF2生成加密密钥 const encoder = new TextEncoder(); const passwordBytes = encoder.encode(encryptionConfig.password); const saltBytes = encoder.encode(encryptionConfig.salt); const keyMaterial = await crypto.subtle.importKey( "raw", passwordBytes, { name: "PBKDF2" }, false, ["deriveKey"] ); const key = await crypto.subtle.deriveKey( { name: "PBKDF2", salt: saltBytes, iterations: encryptionConfig.iterationCount, hash: encryptionConfig.keyShaAlg }, keyMaterial, { name: encryptionConfig.algorithm, length: encryptionConfig.keyLength }, false, ["encrypt"] ); // 转换IV为字节数组 const ivBytes = encoder.encode(encryptionConfig.iv); // 执行加密 const inputBytes = encoder.encode(input); const encryptedBuffer = await crypto.subtle.encrypt( { name: encryptionConfig.algorithm, iv: ivBytes }, key, inputBytes ); // 转换为Base64并URL编码 const encryptedBase64 = btoa(String.fromCharCode(...new Uint8Array(encryptedBuffer))); return encodeURIComponent(encryptedBase64); } // 调用加密函数并返回结果 return encrypt(msisdn); """; WITH MSISDN AS ( SELECT "0000000000" AS msisdn ) SELECT encryption(msisdn) FROM MSISDN;
补充说明
- Web Crypto API为异步接口,因此加密函数需使用
async/await,BigQuery会自动处理UDF的异步逻辑。 - 若需解密MSISDN,可编写对应的解密UDF,复用相同配置并调用Web Crypto的
decrypt方法。
内容的提问来源于stack exchange,提问作者Sharan
相关产品推荐
相关产品推荐

