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' }  
}