node.js - چگونه یک نوع بازگشتی برای یک get در DynamoDB با TypeScript تعریف کنیم؟


من دارم:

  let resItem: Schema

  resItem = await dynamoClient.get({
    TableName,
    Key: {
      uuid: request.body.uuid
    }
  }).promise()

اما من دریافت میکنم:

Type 'PromiseResult<GetItemOutput, AWSError>' is missing the following properties from type 'Schema': uuid, topics, phoneNumber, timezonets(2739)

پاسخ شماره ۱

اگر تعریف GetItemOutput و تعریف PromiseResult را بررسی کنید، میبینید که پرامیس یک شیء از نوع {Item, ConsumedCapacity, $response} باز میگرداند و فقط نتیجه را باز نمیگرداند. بنابراین فکر میکنم باید از PromiseResult به عنوان نوع استفاده کنید و از ویژگی Item به عنوان نتیجه خود استفاده کنید.

پاسخ شماره ۲

به جای فراخوانی مستقیم dynamoClient.get() و تلاش برای تبدیل آن به Schema، استفاده از کتابخانههایی را مد نظر داشته باشید که این فرآیند را برای شما ساده میکنند، زیرا تنظیمات فقط یکبار انجام میشود. من این بسته ساده npm به نام dynamo-repo ایجاد کردهام و دوست دارم آن را معرفی کنم زیرا فکر میکنم مشکل را حل میکند که هیچ بسته دیگری بدون پیچیده کردن بیش از حد حل نمیکند.

اجازه دهید به شما نشان دهم کد شما چگونه به نظر خواهد رسید:

import { DBItemBase} from "dynamo-repo";

interface Schema extends DBItemBase {
  uuid: string,
  topics: [],
  phoneNumber: string,
  timezonets: []
}

const resItem = await itemRepo.findItem({ uuid: "<uuid-value>" });

ثابت resItem از قبل از نوع Schema خواهد بود

شما فقط نیاز دارید که itemRepo را یک بار ایجاد کنید:

import { DynamoDBDocument } from "@aws-sdk/lib-dynamodb";
import { Schema } from "<path to your interface>";
import { Repo } from "dynamo-repo";

export class ItemRepo extends Repo<Schema, "uuid"> {
  constructor(ddbDocClient: DynamoDBDocument) {
   /*
    * ["uuid", "topics", "phoneNumber", "timezonets"] are the "Schema" attributes that are persisted in the table
    * PS: No need to worry about reserved words such as uuid!
    */
    super(ddbDocClient, TableName, ["uuid", "topics", "phoneNumber", "timezonets"], "uuid");
  }
}

سپس با عبور دادن DynamoDBDocument خود آن را نمونهسازی کنید:

const itemRepo = new ItemRepo(dynamoClient);
  • این بهطور خودکار با کلمات خاص مانند «uuid» و غیره مدیریت میکند.
  • این به شما کمک میکند تا موجودیتهای خود را یکنواخت نگه دارید، که بهویژه با شاخصها مفید است.
  • این استفاده از DynamoDB را ساده میکند و همچنین توابع دیگر مخزن مانند addItem()، updateItem()، updateExpressionItem()، searchItems()، deleteItem()، getAllItems() و batchGetItems() را به شما میدهد و همه آنها بسیار شهودی و آسان برای استفاده هستند.