使用 NodeJS 读取数据时,DynamoDB StringSet 会自动解组
DynamoDB StringSet is automatically unmarshalled when reading data with NodeJS
我在 AWS 上的一些 DynamoDB 表中使用了 StringSet 元素。
我将 AWS Lambda 用于我的 APIS。直到一个月前,当我通过 Query/Scan 或 Get 读取其中包含 StringSet 的元素时,我将字符串设置为以下形式的对象:
{
"wrapperName": "Set",
"values": [
"foo",
"bar"
],
"type": "string"
}
所以我的网络应用程序被配置为获得这种格式的结果。
然而,我无缘无故地知道 DynamoDB 现在将所有 StringSet 作为一个简单的字符串数组返回,如下所示:
["foo", "bar"]
这导致我的网络应用程序崩溃。我当然可以想出一些解决方案来避免这种情况,但我想要了解为什么会突然发生这种情况以及如何恢复到以前的格式。我的猜测是配置问题。
什么会导致 dynamoDB 更改查询的结果格式?
以下是有关我的配置的一些详细信息:
- 这发生在 eu-west-1 和 eu-central-1 区域。
- 我使用 AWS.DynamoDB.DocumentClient class 来查询我的数据。
- DynamoDB API 版本是 2012-08-10
- Lambda 运行时是 NodeJS 8.10(我尝试使用 Node 10.X,结果相同)
这是一个查询示例:
const dynamo = new AWS.DynamoDB.DocumentClient({
region: "eu-central-1",
apiVersion: "2012-08-10",
endpoint: "https://dynamodb.eu-central-1.amazonaws.com",
});
dynamo.scan({
TableName: "foo_dev_1"
}, (err, data) => {
if (err) {
response.statusCode = 500;
response.body = JSON.stringify(err);
} else {
response.body = JSON.stringify(data);
}
callback(null, response);
});
如有任何帮助,我们将不胜感激
我发现了问题。
我在我的 Lambda 函数中嵌入了一些依赖项,其中包括 AWS-SDK@2.504.0。在这种情况下,lambda 使用嵌入式 SDK 而不是它最初包含的版本(Node 8.10 为 2.437.0)。
我将我的依赖切换回 2.437.0 并成功返回到字符串集的先前输出格式。
我不明白的是为什么 AWS 会那样改变输出。
我在 aws-sdk-js 的变更日志文件中没有发现这方面的提及。
我在 AWS 上的一些 DynamoDB 表中使用了 StringSet 元素。 我将 AWS Lambda 用于我的 APIS。直到一个月前,当我通过 Query/Scan 或 Get 读取其中包含 StringSet 的元素时,我将字符串设置为以下形式的对象:
{
"wrapperName": "Set",
"values": [
"foo",
"bar"
],
"type": "string"
}
所以我的网络应用程序被配置为获得这种格式的结果。 然而,我无缘无故地知道 DynamoDB 现在将所有 StringSet 作为一个简单的字符串数组返回,如下所示:
["foo", "bar"]
这导致我的网络应用程序崩溃。我当然可以想出一些解决方案来避免这种情况,但我想要了解为什么会突然发生这种情况以及如何恢复到以前的格式。我的猜测是配置问题。
什么会导致 dynamoDB 更改查询的结果格式?
以下是有关我的配置的一些详细信息:
- 这发生在 eu-west-1 和 eu-central-1 区域。
- 我使用 AWS.DynamoDB.DocumentClient class 来查询我的数据。
- DynamoDB API 版本是 2012-08-10
- Lambda 运行时是 NodeJS 8.10(我尝试使用 Node 10.X,结果相同)
这是一个查询示例:
const dynamo = new AWS.DynamoDB.DocumentClient({
region: "eu-central-1",
apiVersion: "2012-08-10",
endpoint: "https://dynamodb.eu-central-1.amazonaws.com",
});
dynamo.scan({
TableName: "foo_dev_1"
}, (err, data) => {
if (err) {
response.statusCode = 500;
response.body = JSON.stringify(err);
} else {
response.body = JSON.stringify(data);
}
callback(null, response);
});
如有任何帮助,我们将不胜感激
我发现了问题。 我在我的 Lambda 函数中嵌入了一些依赖项,其中包括 AWS-SDK@2.504.0。在这种情况下,lambda 使用嵌入式 SDK 而不是它最初包含的版本(Node 8.10 为 2.437.0)。 我将我的依赖切换回 2.437.0 并成功返回到字符串集的先前输出格式。 我不明白的是为什么 AWS 会那样改变输出。 我在 aws-sdk-js 的变更日志文件中没有发现这方面的提及。