AppSync + Go Lambda解析器错误处理:如何控制错误类型与信息?
在Go语言Lambda解析器中控制AppSync的错误字段(errorType、errorMessage等)
核心结论
AppSync确实不依赖Lambda的HTTP状态码处理错误,但你完全可以自定义errorType、errorMessage,甚至携带可选的statusCode——关键是要返回符合AppSync预期的结构化错误JSON,而非普通字符串错误。
实现方案:自定义错误类型
在Go中通过实现error接口,让Lambda返回的错误序列化为AppSync可解析的JSON结构:
- 定义AppSync专用错误结构体
import "encoding/json" type AppSyncError struct { ErrorType string `json:"errorType"` // 自定义错误类型,例如"DynamoDBAccessError" ErrorMessage string `json:"errorMessage"` // 错误详情描述 StatusCode int `json:"statusCode,omitempty"` // 可选字段,仅用于携带调试信息,AppSync不依赖它处理逻辑 } // 实现error接口,返回JSON格式字符串 func (e *AppSyncError) Error() string { jsonBytes, err := json.Marshal(e) if err != nil { // 序列化失败时返回兜底错误 return `{"errorType":"SerializationError","errorMessage":"Failed to serialize error"}` } return string(jsonBytes) }
- 在Lambda处理函数中返回自定义错误
func YourLambdaHandler(event CustomEventStruct) (map[string]any, error) { // 模拟DynamoDB操作失败场景 item, err := getDynamoDBItem(event.ID) if err != nil { return nil, &AppSyncError{ ErrorType: "DynamoDBAccessError", ErrorMessage: "获取DynamoDB条目失败:" + err.Error(), StatusCode: 500, } } // 正常返回业务数据 return map[string]any{"data": item}, nil }
关键说明
- errorType的作用:AppSync会识别该字段,你可以在AppSync Schema中定义对应的错误类型(如通过Union类型),让前端精准捕获特定错误场景。
- statusCode:正如你查阅的资料,AppSync不会用这个字段处理错误逻辑,但可作为调试信息携带,方便排查问题。
- 序列化要求:自定义错误的
Error()方法必须返回合法JSON字符串,否则AppSync会解析失败,自动将错误类型设为Lambda:Unhandled。
额外:Schema中关联自定义错误
若需在AppSync中明确错误类型,可在Schema中定义Union类型,与Lambda返回的errorType对应:
type Query { getItem(id: ID!): GetItemResult @aws_lambda(function: "your-lambda-arn") } type Item { id: ID! name: String! } type DynamoDBAccessError { message: String! } union GetItemResult = Item | DynamoDBAccessError
当Lambda返回errorType: "DynamoDBAccessError"时,AppSync会自动将错误映射到DynamoDBAccessError类型,前端可通过类型判断处理不同错误场景。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

