Кто-нибудь может объяснить, как использовать тип GetItemInput при вызове DocumentClient.get?
Если я передаю объект любого типа, get работает, но если я пытаюсь ввести объект params строго, я получаю эту ошибку:
ValidationException: The provided key element does not match the schema
Вот мой код лямбда-функции, где я передаю параметры как тип any:
export const get: Handler = async (event: APIGatewayProxyEvent): Promise<APIGatewayProxyResult> => {
console.info(event.pathParameters)
if (!event.pathParameters) {
throw Error("no path params")
}
const params: any = {
Key: {
id: event.pathParameters.id
},
TableName: table
}
console.info(params)
try {
const result: any = await dynamoDb.get(params).promise()
return {
body: JSON.stringify(result.Item),
statusCode: result.$response.httpResponse.statusCode
}
} catch (error) {
console.info(error)
return {
body: JSON.stringify({
message: `Failed to get project with id: ${event.pathParameters!.id}`
}),
statusCode: 500
}
}
}
И вот моя попытка заставить его работать с типом GetItemInput
export const get: Handler = async (event: APIGatewayProxyEvent): Promise<APIGatewayProxyResult> => {
console.info(event.pathParameters)
if (!event.pathParameters) {
throw Error("no path params")
}
const params: GetItemInput = {
Key: {
"id": { S: event.pathParameters.id }
},
TableName: table
}
console.info(params)
try {
const result: any = await dynamoDb.get(params).promise()
return {
body: JSON.stringify(result.Item),
statusCode: result.$response.httpResponse.statusCode
}
} catch (error) {
console.info(error)
return {
body: JSON.stringify({
message: `Failed to get project with id: ${event.pathParameters!.id}`
}),
statusCode: 500
}
}
}
Если я оставлю Key как раньше, аля:
const params: GetItemInput = {
Key: {
id: event.pathParameters.id
},
TableName: table
}
Неудивительно, что я получаю ошибку типа. Но не могу понять, как я могу сформировать свой Key так, чтобы не получить ValidationException.
Обратите внимание, что поле id имеет тип String в DynamoDB.
это мой оператор импорта, который работает, поэтому предположим, что он находится в типах данных Dynamo-DB
Эта ссылка предполагает, что это должно быть действительным... const params: GetItemInput = {Key: { "id": event.pathParameters.id}, TableName: table}, однако я получаю сообщение об ошибке типа, говорящее, что «тип« строка »не имеет атрибутов общего с типом 'AttributeValue'"
Я не вижу ссылки на это в ссылке?
SDK специально абстрагирует значения атрибутов и вместо этого использует собственный объект JSON (см. верхнюю часть страницы, на которую вы ссылаетесь). Я могу ошибаться, но я не думаю, что то, что вы пытаетесь, возможно.
поэтому я не должен использовать тип GetItemInput? Зачем иметь его в сигнатуре метода, если вы не можете его использовать. Если я импортирую типы, а затем нахожусь над методом, intellisense говорит мне, что он принимает в качестве аргумента GetItemInput, но, похоже, нет способа создать тот, который действительно работает, все, что я пытаюсь сделать, это использовать типы, которые метод говорит, что принимает свою подпись





Я думаю, вы смешиваете два разных файла определения клиента DynamoDB и DynamoDB.DocumentClient. Пока вы используете клиент DynamoDB.DocumentClient, в то же время вы используете интерфейс DynamoDB.Types.GetItemInput из DynamoDB.
Вы должны использовать DynamoDB.DocumentClient.GetItemInput:
import {DynamoDB} from 'aws-sdk';
const dynamo = new DynamoDB.DocumentClient({apiVersion: '2012-08-10'});
...
const params: DynamoDB.DocumentClient.GetItemInput = {
TableName: table,
Key: {
id: event.pathParameters.id
}
};
const result = await this.dynamo.get(params).promise();
Ответ @ttulka идеален, но просто добавлю, что у меня была та же проблема, и это действительно помогло потратить 5 минут, чтобы устранить неоднозначность МНОЖЕСТВА различных способов доступа к DynamoDB из официальных SDK AWS JS.
Чтение этого в течение 5 минут - мой ответ, и вам все станет ясно после этого;
https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/modules/_aws_sdk_lib_dynamodb.html
TLDR; является;
import { DynamoDB } from "@aws-sdk/client-dynamodb"; // ES6 import
import { DynamoDBDocument, PutCommandInput } from "@aws-sdk/lib-dynamodb"; // ES6 import
Где вы нашли GetItemInput? Мне это не кажется частью JS SDK. Я вижу его часть Ruby и Go SDK.