Snowflake外部函数响应转换器报JSON语法错误的原因
问题分析与解决
错误原因
通过外部函数test()触发调用时,Snowflake传递给响应转换器response_translator的EVENT.body已经是解析完成的JSON对象,但你的代码仍执行JSON.parse(EVENT.body),导致JavaScript自动将对象转为字符串"[object Object]",再尝试解析这个无效的JSON字符串,最终触发语法错误。
而手动测试时,你传入的body是转义后的JSON字符串(比如"{\"error\":...}"),所以JSON.parse能正常工作——这就是测试和实际调用表现不一致的核心原因。
修复方案
修改响应转换器函数,直接使用已解析的EVENT.body对象,无需再执行JSON.parse:
CREATE OR REPLACE FUNCTION response_translator(EVENT OBJECT) RETURNS OBJECT LANGUAGE JAVASCRIPT AS ' // 直接使用Snowflake已解析完成的EVENT.body对象 const parsedJsonString = JSON.stringify(EVENT.body); const modifiedJson = { "data": [ [0, parsedJsonString] ] }; return modifiedJson; ';
如果需要保留错误信息的结构化格式(而非转成字符串),也可以直接返回对象:
CREATE OR REPLACE FUNCTION response_translator(EVENT OBJECT) RETURNS OBJECT LANGUAGE JAVASCRIPT AS ' const modifiedJson = { "data": [ [0, EVENT.body] ] }; return modifiedJson; ';
补充说明
Snowflake对外部函数的响应处理规则:
- 若Lambda返回的
body是JSON字符串,Snowflake会自动将其解析为JSON对象,再传递给响应转换器的EVENT.body - 手动测试时你传入的是未解析的字符串,所以
JSON.parse有效,但实际场景中Snowflake已完成了解析步骤
内容的提问来源于stack exchange,提问作者Navidk
相关产品推荐
相关产品推荐

