AWS NodeJS TypeScript SDK V3 DynamoDB PutItemCommand - ტიპის შეცდომა: შეუძლებელია შეუწვდომელ თვისებას წვდომა (კითხულობს '0')
მე ვქმნი აპლიკაციას, რომელიც მართავს ინფორმაციას სხვადასხვა მედიის შესახებ, როგორიცაა ვიდეოები, სურათები და ა.შ. აპლიკაცია იყენებს DynamoDB-ს ინფორმაციის შესანახად, ხოლო მე ვიყენებ TypeScript AWS SDK-ს ბაზასთან დასაკავშირებლად.
ამჟამად ვკოდირებ ვიდეოებთან დაკავშირებული ინფორმაციის შენახვის ნაწილს, მაგრამ მიჭირს ობიექტის ჩასმა DynamoDB-ის ცხრილში და ამას აკეთებ შემდეგი კოდით:
import { DynamoDBClient, PutItemCommand } from '@aws-sdk/client-dynamodb';
import { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda';
import { DynamoDBDocumentClient } from '@aws-sdk/lib-dynamodb';
export async function postVideo(
event: APIGatewayProxyEvent,
ddbClient: DynamoDBClient
): Promise<APIGatewayProxyResult> {
const ddbDocClient = DynamoDBDocumentClient.from(ddbClient);
const item = JSON.parse(event.body!);
const currentDateTime = new Date().toISOString();
const pk = `VIDEO`;
const sk = `${item.owner}#${item.title}#${currentDateTime}`;
item.PK = pk;
item.SK = sk;
const result = await ddbDocClient.send(
new PutItemCommand({
TableName: process.env.TABLE_NAME,
Item: item,
})
);
console.log(result);
return {
statusCode: 201,
body: JSON.stringify({ PK: pk, SK: sk }),
};
}
მე ვიცი, რომ DynamoDBClient-ის გამოყენებისას უნდა განვსაზღვროთ ელემენტის თითოეული ველის ტიპი, ამიტომ გადავწყვიტე გამომეყენებინა DynamoDBDocumentClient პირდაპირ DynamoDBClient-ის ნაცვლად, რათა არ მომიწიოს marshall-unmarshall, მაგრამ როდესაც ვცდილობ ელემენტის ჩასმას მონაცემთა ბაზაში, ის ასახავს "unreadnofin" typeE-ის თვისებებს.
როდესაც ცდილობთ ნივთის ჩასმას, მასში არის მსგავსი რამ:
{
owner: "Test",
title: "Test",
description: "Test",
link: "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
PK: "VIDEO",
SK: "Test#Test#2023-06-20T17:20:59.683Z",
}
არ ვიცი, რაღაცას ხომ არ ვკარგავ აქ. ჩემი ვალადობაა, რომ ეს ნივთის ტიპებს სწორად ვერ იღებს, მაგრამ მეგონა, რომ ის პირდაპირ JS ობიექტიდან უნდა მიგეღო.
პასუხი #1
იმის გამო, რომ თქვენ იყენებთ DynamoDBDocumentClient, თქვენ უნდა გამოიყენოთ PutCommand "@aws-sdk/lib-dynamodb"-იდან, ნაცვლად PutItemCommand-ის @aws-sdk/client-dynamodb-დან.
გამოიყენეთ ეს იმპორტი მის ნაცვლად:
import { PutCommand } from "@aws-sdk/lib-dynamodb";
ჩემი აზრით, ეს არის აპარატურის არაკომპეტენტურობის ნიშანი Amazon-ის მხრიდან. მხოლოდ ერთი ბრძანებების ნაკრები უნდა არსებობდეს, თუმცა მესმის, რომ ეს აზრიანია.
პასუხი #2
მე დღეს შევხვდი ამ პრობლემას v3 SDK-ის გამოყენებისას. ეს მაგალითი აჩვენებს მნიშვნელობებისთვის ტიპების განსაზღვრას. ამის გამოტოვებამ მიშველა პრობლემის გადაჭრაში: https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/dynamodb-example-table-read-write.html
არ მუშაობს:
const item = {
key: 'my-key',
value: 'my-value'
}
ნამუშევრები :
const item = {
key: { 'S': 'my-key' },
value: { 'S': 'my-value' }
}
