Node.js调用DynamoDB Query接口偶现JSON语法错误问题
Node.js调用DynamoDB Query接口偶现JSON语法错误
使用Node.js连接DynamoDB表,调用Query接口查询数据时,有时能正常返回包含数据的JSON,但偶尔会返回存在语法错误的JSON。
相关代码
let ddb = new AWS.DynamoDB(config) export const dynamoDb = ddb export const dynamoClient = new AWS.DynamoDB.DocumentClient({ service: dynamoDb }) let params = { TableName: auditTable, IndexName: 'importId-auditStatus-index', KeyConditionExpression: 'importId = :importId and auditStatus = :auditStatus', ExpressionAttributeValues: { ':importId': importId, ':auditStatus' : 'Imported' } } let response = await dynamoClient.query(params, function(err, data) { if (err) { console.log("Error", err); } else { return data; } }).promise(); console.log("response",response)
偶现的错误JSON示例
{ "Count":117, "Items":[ ... truncated by me ... { "pricingTemplate":{ "NULL":true }, "auditId":{ "S":"7555555_15287101" }, "importId":{ "S":"8c6976bb-8680-47ce-bcfb-470c8e97740f" }, "auditStatus":{ "S":"Imported" }, "Id":{ "S":"420f50cb-3d03-49cb-b1da-1a36aa099e6c" }, "recordType":{ "S":"currecy_test_tl" } } ,{"pricingTemplate":{"NULL":true},"auditId":{"S":"7555555_15287164"},"importId":{"S":"8c6976bb-8680-47ce-bcfb-470c8e97740f"},"auditStatus":{"S":"Imported"}7555555_15287206"},"importId":{"S":"8c6976bb-8680-47ce-bcfb-470c8e97740f"},"auditStatus":{"S":"Imported"},"Id":{"S":"e7042719-fa77-4939-9d05-ad41f3bdc7dc"},"recordType":{"S":"currecy_test_tl"}},{"pricingTemplate":{"NULL":true},"auditId":{"S":"7555555_15287155"},"importId":{"S":"8c6976bb-8680-47ce-bcfb-470c8e97740f"},"auditStatus":{"S":"Imported"},"Id":{"S":"bee5d2e3-60cf-4ecf-8249-d25de6e8c28a"},"recordType":{"S":"currecy_test_tl"}}, { "pricingTemplate":{ "NULL":true }, "auditId":{ "S":"7555555_15287111" }, "importId":{ "S":"8c6976bb-8680-47ce-bcfb-470c8e97740f" }, "auditStatus":{ "S":"Imported" }, "Id":{ "S":"2161a17f-63c5-4c45-b7b4-9750cc202b23" }, "recordType":{ "S":"currecy_test_tl" } } ], "ScannedCount":117 }
语法错误具体出现在"auditStatus":{"S":"Imported"}7555555_15287206"},位置,此处缺失了"auditId":{"S":"前缀,导致JSON结构断裂。
问题排查与解决
修复回调与Promise混用问题
你的代码同时使用了回调函数和.promise(),这会导致逻辑冲突。调用.promise()后不需要再传入回调,直接用await接收结果即可,多余的回调可能引发数据处理异常。修改后的代码:let ddb = new AWS.DynamoDB(config) export const dynamoDb = ddb export const dynamoClient = new AWS.DynamoDB.DocumentClient({ service: dynamoDb }) let params = { TableName: auditTable, IndexName: 'importId-auditStatus-index', KeyConditionExpression: 'importId = :importId and auditStatus = :auditStatus', ExpressionAttributeValues: { ':importId': importId, ':auditStatus' : 'Imported' } } try { let response = await dynamoClient.query(params).promise(); console.log("response", response); } catch (err) { console.log("Error", err); }升级AWS SDK版本
旧版本的AWS SDK for JavaScript可能存在序列化/反序列化bug,导致返回数据格式异常。将SDK升级到最新稳定版本尝试解决问题。验证DynamoDB数据完整性
检查对应importId下的auditId字段是否存在格式异常的条目,比如缺失引号或结构错误的数据(虽然概率较低,但可以排除数据本身的问题)。排查网络传输问题
偶现的错误可能源于网络传输中的数据截断或篡改,可开启AWS SDK的日志功能,查看原始返回数据是否已经存在异常。
内容的提问来源于stack exchange,提问作者Junaid Rahman
相关产品推荐
相关产品推荐

