lambdaからDynamoDBから取得した際にJSONにデータ型がついていました。こんな感じで。
"Items": [
{
"name": {
"S": "Taro"
},
"number": {
"N": "1"
}
}
]
この状態でフロントに返すと何かと面倒なので普通のJSONで返したい。まぁ、こういう形ですね。
"Items": [
{
"name": "Taro",
"number": 1
}
]
環境は以下になります。
まずは素直に@aws-sdk/client-dynamodbを使ってScanしてきます。
import {
DynamoDBClient,
ScanCommand,
ScanCommandInput,
ScanCommandOutput
} from "@aws-sdk/client-dynamodb";
const client = new DynamoDBClient({});
const params: ScanCommandInput = {
TableName: "Table"
};
try {
const command = new ScanCommand(params);
const response = client.send(command);
return response;
} catch (error) {
return error;
}
これだと普通にデータ型のレスポンスが返ってきます。
"Items": [
{
"name": {
"S": "Taro"
},
"number": {
"N": "1"
}
}
]
これを普通のJSONにする方法は2つあります。
1つ目は@aws-sdk/util-dynamodbを使うやり方です。
ドキュメントにもある通り返ってきた値にunmarshall
でコンバートします。
const { DynamoDB } = require("@aws-sdk/client-dynamodb");
const { marshall, unmarshall } = require("@aws-sdk/util-dynamodb");
const client = new DynamoDB(clientParams);
const params = {
TableName: "Table",
Key: marshall({
HashKey: "hashKey",
}),
};
const { Item } = await client.getItem(params);
unmarshall(Item);
2つ目は@aws-sdk/lib-dynamodbを使うやり方です。こっちの方がスマートですし、何より自動でやってくれるので便利です。
import {DynamoDBClient} from "@aws-sdk/client-dynamodb";
import {
DynamoDBDocument,
ScanCommand,
ScanCommandInput,
ScanCommandOutput
} from "@aws-sdk/lib-dynamodb";
const marshallOptions = {
convertEmptyValues: false, // false, by default.
removeUndefinedValues: false, // false, by default.
convertClassInstanceToMap: false // false, by default.
};
const unmarshallOptions = {
wrapNumbers: false // false, by default.
};
const translateConfig = {marshallOptions, unmarshallOptions};
const client = new DynamoDBClient({});
const ddbDocClient = DynamoDBDocument.from(client, translateConfig);
const params: ScanCommandInput = {
TableName: "Table"
};
try {
const command = new ScanCommand(params);
const response = ddbDocClient.send(command);
return response;
} catch (error) {
return error;
}
これで普通のJSONが返ってきました。