使用AWS AppSync JavaScript解析器(NONE数据源)解析String字段时出现转换错误的解决咨询
AWS AppSync JavaScript解析器(NONE数据源)解析String字段时出现转换错误的解决咨询
看起来你遇到的问题是因为Pipeline解析器的响应模板没有正确处理JavaScript函数返回的字符串值,导致AppSync试图把裸字符串解析成JSON对象失败了。让我一步步帮你梳理问题并解决:
错误根源分析
你看到的错误提示 Unable to convert 123Another City to Object. 是关键:
你的JS函数返回的是一个纯字符串,但当前Resolver的响应模板 $context.result 直接输出了这个裸字符串。AppSync要求响应模板输出合法的JSON格式,而没有被引号包裹的裸字符串不属于合法的JSON对象,因此触发了转换错误。
解决方案(两种可选)
方案一:修改Resolver的响应模板(最简单直接)
直接调整Terraform中的响应模板,让输出成为合法的JSON字符串:
方式1:用双引号手动包裹结果
修改Terraform资源配置:
resource "aws_appsync_resolver" "translatePlace" { api_id = var.app-sync-id field = "name" type = "Place" request_template = "{}" # 用双引号包裹结果,输出合法JSON字符串 response_template = "\"$context.result\"" kind = "PIPELINE" pipeline_config { functions = [ module.translatePlace.appsync-function.function_id ] } depends_on = [module.translatePlace] }
方式2:使用AppSync内置工具函数
用$util.toJson()自动将结果转为合法JSON格式(字符串会自动被加上引号):
response_template = "$util.toJson($context.result)"
方案二:修改JavaScript函数的返回结构(更规范)
如果你希望保持函数返回对象结构的习惯,可以调整JS函数的响应逻辑,再通过模板提取对应值:
- 修改你的JavaScript函数:
export function response(context) { // 返回包含字段的对象,而非直接返回字符串 return { translatedName: context.result.translatedName }; }
- 同步修改Terraform的响应模板:
response_template = "$context.result.translatedName"
不管选择哪种方案,调整后AppSync都能正确识别并返回转换后的字符串值,不会再抛出转换错误了。
备注:内容来源于stack exchange,提问作者Rastislav
相关产品推荐
相关产品推荐

