Когда я пытаюсь запросить Amazon DynamoDB, используя собственные типы данных JavaScript, мне не удается выполнить это задание (например, :zipcode ниже). Например, следующий код не работает с Error while fetching data: TypeError: Cannot read properties of undefined (reading '0').
import { DynamoDBClient, QueryCommand } from "@aws-sdk/client-dynamodb";
const client = new DynamoDBClient({});
await client.send(
new QueryCommand({
TableName: tableName,
KeyConditionExpression: "zipcode = :zipcode ",
ExpressionAttributeValues: {
":zipcode": "11111",
},
ConsistentRead: true,
})
);
Но приведенный ниже код работает.
import { DynamoDBClient, QueryCommand } from "@aws-sdk/client-dynamodb";
const client = new DynamoDBClient({});
docClient.send(
new QueryCommand({
TableName: tableName,
KeyConditionExpression: "zipcode = :zipcode ",
ExpressionAttributeValues: {
":zipcode": { "S": "11111" },
},
ConsistentRead: true,
})
);
Что это за синтаксис { "S": <value> } и зачем он нужен?





Ваша вторая версия синтаксиса верна. DynamoDB необходимо знать, какой тип данных вы отправляете. S в { "S": "1111" } означает, что вы отправляете строку. Вы можете увидеть полный список дескрипторов типов данных здесь.
При желании, если вы хотите использовать свой первый синтаксис, вы можете использовать Document Client.
V3
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
import { DynamoDBDocumentClient, QueryCommand } from "@aws-sdk/lib-dynamodb";
const client = new DynamoDBClient({});
const docClient = DynamoDBDocumentClient.from(client);
docClient.send(
new QueryCommand({
TableName: tableName,
KeyConditionExpression: "zipcode = :zipcode",
ExpressionAttributeValues: {
":zipcode": "11111",
},
ConsistentRead: true,
})
);
V2
import * as AWS from "aws-sdk";
var params = {
TableName: "Table",
KeyConditionExpression: "zipcode = :zipcode",
ExpressionAttributeValues: {
":zipcode": "11111",
}
};
var documentClient = new AWS.DynamoDB.DocumentClient();
documentClient.query(params, function(err, data) {
if (err) console.info(err);
else console.info(data);
});
Библиотека кода для JS SDK содержит несколько примеров, демонстрирующих этот синтаксис.
Еще одна вещь, которую возвращают данные: Item: { zipCode: { S: '11111' }, CouncilId: { S: 'C10001' }, streetData: { L: [[Object], [Object] ] } } Как получить данные без типов данных, таких как S:, L: и т. д.? Для чтения я использую v2
Я не уверен, почему вы используете V2 в одном месте и V3 в другом, я бы предостерег от этого. Насколько мне известно, у V2 нет эквивалента lib-dynamodb. Вам придется обрабатывать типы данных самостоятельно. Если вы нашли ответ полезным, пожалуйста, примите его!
Коллега поправил меня. Он существует :) docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/…
Спасибо @Кори. Не могли бы вы указать модульный тест для запроса DynamoDB с использованием v2 sdk?
@Spartacus Я не могу, так как их не существует :)
ваш вопрос не ясен? Вам просто интересно, почему вы не получаете ошибку, когда используете
":zipcode": {S: "11111"}, а не":zipcode": "11111"?