求助:解决GridDB WebAPI插入数据时的'Mapping JSON data error at field 'rows''错误
求助:解决GridDB WebAPI插入数据时的'Mapping JSON data error at field 'rows''错误
我正在开发一个基于Node.js和GridDB Cloud WebAPI的智能能源监控应用,尝试往名为energy_data的容器中插入数据时,始终收到400 Bad Request错误,提示Mapping JSON data error at field 'rows'。运行node insertData.js后得到的具体错误信息如下:
❌ Error inserting data: Status : 400 Status Text : Bad Request Error Code : N/A Error Message: Mapping JSON data error at field 'rows' Full Data : { "version": "v2", "errorCode": 0, "errorMessage": "Mapping JSON data error at field 'rows'" } Stack Trace: AxiosError: Request failed with status code 400 ...(省略后续栈信息)
我已经尝试过的操作
- 成功创建了
energy_data容器,Schema为:timestamp:TIMESTAMP(行键)、value:DOUBLE、device_id:STRING - 编写了
insertData.js代码,使用Axios发送POST请求,Payload结构为包含多行数据的数组 - 尝试过用ISO字符串和原始Date对象传递
timestamp字段,确认容器存在且字段名、类型完全匹配
环境信息
- 系统:Ubuntu 20.04.6 LTS (WSL2 on Windows 10 Pro)
- Node.js版本:v20.x
- Axios版本:1.6
- GridDB Cloud WebAPI版本:v2
解决方案(基于GridDB WebAPI使用经验)
我之前在使用GridDB WebAPI v2时也遇到过几乎一模一样的错误,这个问题大多是数据类型映射不兼容或者Payload格式不符合官方要求导致的,你可以按照下面的步骤一步步排查修复:
1. 把TIMESTAMP字段从ISO字符串改为毫秒级时间戳数值
GridDB WebAPI对TIMESTAMP类型的数值格式支持更稳定,使用毫秒时间戳(而非ISO字符串)可以避免字符串解析的兼容性问题。修改你的Payload代码:
const payload = { rows: [ // 用Date.now()直接生成毫秒时间戳 [Date.now(), 12.5, "device_001"], [Date.now() + 60000, 18.2, "device_002"] ] };
2. 严格匹配容器列顺序与Payload行元素顺序
GridDB的位置式数组格式(数组的数组)对顺序要求极高,必须保证Payload中每个行数组的元素顺序和容器创建时的列顺序完全一致:
- 确认你的容器Schema列顺序是
timestamp → value → device_id - 如果容器列顺序不同(比如
timestamp → device_id → value),需要调整Payload中元素的顺序,否则会出现类型映射错误
3. 验证请求凭证和URL的正确性
虽然你已经成功创建了容器,但可以通过简单的GET请求验证凭证和URL是否有效:
// 新增一段测试代码,获取容器元数据 axios.get(`${baseURL}/containers/energy_data`, { headers: { 'Authorization': authHeader } }) .then(res => console.log("容器元数据:", res.data)) .catch(err => console.error("获取容器元数据失败:", err));
如果能正常返回容器的Schema信息,说明凭证和URL是正确的;如果失败,需要检查Basic Auth凭证或URL中的集群/数据库名称是否有误。
4. 用Curl测试排除Node.js/Axios的问题
如果上述修改后仍然报错,可以用Curl直接发送请求,排除Node.js或Axios的自动转换问题:
curl -X POST "https://xxxxxxx.griddb.com:xxxx/griddb/v2/gs_clustxxxxxx7/dbs/xxxxxxx/containers/energy_data/rows" \ -H "Content-Type: application/json" \ -H "Authorization: Basic xxxxxxxxM0wxei1hZG1pbjxxxxxxxxx=" \ -d '{ "rows": [ [1716203645000, 12.5, "device_001"], [1716203705000, 18.2, "device_002"] ] }'
如果Curl请求成功,说明是Node.js代码的问题(比如Axios的配置);如果Curl也报错,需要进一步检查GridDB容器的Schema或权限配置。
内容来源于stack exchange
相关产品推荐
相关产品推荐

