如何正确传递嵌套数组作为GraphQL API的参数
嵌套数组传递到GraphQL后端后变为字符串的问题解决
场景与问题
我当前使用AWS AppSync,不过这个问题也适用于通用GraphQL/JavaScript/API场景。
需要传递以下嵌套数组数据作为API参数:
const DUMMY_DATA = [ ['First Name', 'Last Name', 'company', 'email', 'phone', 'Address', 'City', 'State', 'Zip Code'], ['Lambert', 'Beckhouse', 'StackOverflow', 'lbeckhouse0@stackoverflow.com', '512-555-1738', '316 Arapahoe Way', 'Austin', 'TX', '78721'], ['Maryanna', 'Vassman', 'CDBABY', 'mvassman1@cdbaby.com', '479-204-8976', '1126 Troy Way', 'Fort Smith', 'AR', '72916'] ]
调用API的代码如下:
try { await doAPIWork({data: DUMMY_DATA}) } catch (err) { console.error(err) }
但数据到达后端后,嵌套数组的类型变为String,无法正常遍历——比如DUMMY_DATA[0]看起来是数组格式,但实际类型是字符串,无法转换回数组。试过两种Schema定义都未解决:
// 第一种尝试 type Mutation { doAPIWork(data: [String]): String @function(name: "doAPIWork-dev") } // 第二种尝试 type Mutation { doAPIWork(data: [AWSJSON]): String @function(name: "doAPIWork-dev") }
解决办法
1. 匹配正确的GraphQL类型定义
你的数据是二维字符串数组,之前的Schema类型均不匹配:
[String]是一维字符串数组,无法容纳嵌套结构;[AWSJSON]是一维JSON数组,同样不匹配二维数组格式。
直接用[[String]]定义二维字符串数组,这是最贴合数据结构的方案:
type Mutation { doAPIWork(data: [[String]]): String @function(name: "doAPIWork-dev") }
这种情况下,前端直接传递原数组即可,AppSync会正确把二维数组传递到后端,不需要额外序列化/反序列化操作。
2. 用AWSJSON处理动态结构(数据结构不固定时)
如果数据结构可能变化,或者不想严格定义二维数组类型,可以用AWSJSON类型(注意不是数组形式):
- 前端发送前将整个数组序列化为JSON字符串:
await doAPIWork({ data: JSON.stringify(DUMMY_DATA) }) - 修改Schema:
type Mutation { doAPIWork(data: AWSJSON): String @function(name: "doAPIWork-dev") } - 后端接收后解析JSON字符串:
// 以Lambda为例,从事件参数中取出数据解析 const parsedData = JSON.parse(event.arguments.data);
3. 检查后端参数接收逻辑
如果用Lambda作为后端函数,确认Lambda事件参数中event.arguments.data的类型是否正确。使用[[String]]类型时,AppSync会直接传递数组对象,后端可直接遍历;如果用AWSJSON方案,必须手动将字符串解析为数组。
内容的提问来源于stack exchange,提问作者elguapo
相关产品推荐
相关产品推荐

