e
sv

NestJS uygulama verilerini Dynamoose ile modelleme

avatar

Yazılım Method

  • e 0

    Mutlu

  • e 0

    Eğlenmiş

  • e 0

    Şaşırmış

  • e 0

    Kızgın

  • e 0

    Üzgün

DynamoDB bir NoSQL veritabanıdır , yani önceden tanımlanmış bir yapısı yoktur. DynamoDB ile, veri modeli hakkında endişelenmeden istediğiniz herhangi bir veriyi depolayabilirsiniz, bu da onu yapılandırılmamış verilerle çalışırken kullanmak için güçlü bir araç haline getirir.

Ancak NoSQL'in bir bedeli vardır. Bir yapı tanımlamamak, yapıyı ve veri türlerini tutarlı bir şekilde korumanız veya uygulamanızın çökmesi riskini almanız gerektiği anlamına gelir.

Geliştiriciler bu sorunları önlemenin yollarını bulmuşlardır. Bu makalede, veritabanınızın modellerini yönetmek için neden DynamoDB ile ORM veya nesne-ilişkisel eşleme kullanmanız gerektiğini keşfedeceğiz. Ayrıca Dynamoose'un neden amaçlarımız için kullanılacak en iyi ORM aracı olduğunu da göreceğiz. Son olarak, Dynamoose'u bir NestJS uygulamasıyla entegre edeceğiz ve referans olarak kullanabileceğiniz eksiksiz bir CRUD uygulaması oluşturacağız.

Bu makalede ilerlemek için:

Başlayalım!

DynamoDB ile ağrı noktaları

Bir JavaScript uygulamasından DynamoDB ile etkileşim kurmanın en yaygın yolu, aws-sdk DynamoDB istemcisini kullanmaktır. Ancak bu birkaç sorunla birlikte gelir.

1. DynamoDB'nin veri modellerini yönetmenin bir yolu yok

aws-sdk istemcisi, uygulama modellerinizi yönetmeniz için bir yol sunmaz. Uygulamanız tutarlılık gerektiriyorsa bu bir güçlük haline gelir.

2. DynamoDB'nin veri doğrulaması yok

Bu tartışmalı bir konu olabilir çünkü DynamoDB kullanmanın önemli faydalarından biri, veritabanında herhangi bir şeyi saklama yeteneğidir.

Ama gerçekte, buna çoğu zaman ihtiyaç duymuyoruz. Örneğin, yaş alanına e-posta koymuyoruz, değil mi? Peki ne yapıyoruz?

 if(isim.uzunluk > 0 && isEmail(email)){
  // değeri sakla
}

Doğrulamayı kendimiz ve bakımı zorlaşan her alan için yapmalıyız.

3. DynamoDB ile garip sözdizimi

DynamoDB'ye erişim sözdizimi gariptir ve genellikle uygunsuz olan dize sorgularına bağlıdır. Aşağıda, bir video dizisinden bir bölüm hakkında bilgi içeren bir tabloyu sorgulayan resmi belgelerden bir örnek verilmiştir.

 var params = {
  ExpressionAttributeValues: {
    ':s': {N: '2'},
    ':e' : {N: '09'},
    ':konu' : {S: 'SÖZLÜK'}
  },
  KeyConditionExpression: 'Sezon = :s ve Bölüm > :e',
  ProjectionExpression: 'Bölüm, Başlık, Altyazı',
  FilterExpression: 'içerir (Altyazı, :konu)',
  TabloAdı: 'EPISODES_TABLE'
};

ddb.query(params, function(err, data) {
   // hatayı ve diğer şeyleri burada ele al
});

Bunu anlamak uzun zaman alabilir. Ve akıl yürütmeniz gereken birden fazla alan olduğunda, bu bir kabusa dönüşür!

4. DynamoDB'nin bakımı zordur

DynamoDB ile ilgili bu sorunlar, geliştiricilere (kendim dahil) sorgularla ilgili akıl yürütme konusunda zor anlar yaşatıyor. Ve sözdizimi tanıdık olmadığı için, hızlı projeler için arzu edilmeyen dik bir öğrenme eğrisi gerektirir.

DynamoDB sorunlarına çözüm

Daha önce bahsedilen sorunları ORM veya nesne-ilişkisel haritalama ile çözebiliriz. ORM araçları, veritabanınızın modellerini yönetmeyi kolaylaştırır ve daha basit sözdizimi kullanarak veritabanına erişimi kolaylaştırır.

ORM kullanmanın birçok faydası vardır:

  • Sözdizimi basittir
  • En sevdiğiniz TypeScript'ten yararlanabildiğinizde modelleri yönetmek daha kolay hale gelir
  • daha güvenli
  • Veri doğrulama kolayca yapılabilir
  • DynamoDB tablolarıyla iletişim kurabilir ve TypeScript desteği sağlayabilir

ORM aracınız olarak neden Dynamoose'u seçmelisiniz?

Dynamodb-data-types , dyngod b ve dynasaur dahil olmak üzere DynamoDB için seçilebilecek birçok ORM aracı vardır.

Ancak hiçbiri Dynamoose kadar popüler değildir.

  • kullanımı kolaydır
  • MongoDB için ORM aracı olan Mongoose'a benzer ve sözdizimini geliştiriciler için çok tanıdık hale getirir
  • İyi Türler desteği sunar
  • Güçlü filtreleme yeteneklerine sahiptir
  • DynamoDB işlemlerini destekler
  • Geri arama ve söz desteği sunar

Bugün Dynamoose'u bir NestJS uygulaması ile nasıl kullanabileceğimizi göreceğiz.

Dynamoose ile NestJS uygulaması oluşturma

NestJS projemizi oluşturmanın ilk adımı NestJS CLI'yi kurmaktır.

 npm i -g @nestjs/cli

Ardından, ortak proje projesini başlatın.

 yuva yeni nestjs-dynamoose-entegrasyon

Ardından, gerekli bağımlılığı yükleyin.

 iplik eklemek dinamo

Ve başlamaya hazırız!

1. Dynamoose'u Yapılandırma

Dynamoose'un AWS hesabınızdaki DynamoDB tablolarınızla konuşabilmesi için uygun izne ihtiyacı vardır. Bunu yapılandırmanın farklı yollarını burada bulabilirsiniz .

Amaçlarımız için, uygulama içindeki access_key ve secret_key kullanarak kimlik bilgilerini ayarlayacağız.

main.ts dosyasını açın ve aşağıdaki yapılandırma kodunu ekleyin:

 { NestFactory } öğesini '@nestjs/core'dan içe aktarın;
{ AppModule } dosyasını './app.module'den içe aktarın;

* 'dynamoose'dan dinamo olarak içe aktarın;

zaman uyumsuz işlev önyükleme() {
  // bunu uygulama oluşturulmadan önce yapın.
  dynamoose.aws.sdk.config.update({
    accessKeyId: 'SİZİN_ACCESS_KEY',
    secretAccessKey: 'SİZİN_GİZLİĞİNİZ_ACCESS_KEY',
    bölge: 'SİZİN_PREFERRED_BÖLGE',
  });

  const app = bekle NestFactory.create(AppModule);
  app.listen(3000);
}
önyükleme();

Bu anahtarları nasıl alacağınızdan emin değilseniz , belgelere başvurabilirsiniz . İdeal olarak, bunları ortam değişkenlerini kullanarak yüklemeli ve bunları proje içinde düz metin olarak kullanmamalısınız.

2. Kullanıcı uç noktalarının oluşturulması

NestJS ile ilgili güzel olan şey, sizin için otomatik olarak birçok kazan plakası oluşturmasıdır. Bugün Dynamoose kullanarak bir CRUD uç noktası oluşturacağız. Bunun için kazan plakası kodlarını oluşturalım.

Komut satırınızda aşağıdaki komutu çalıştırın.

 yuva g kaynak kullanıcısı

Komutu çalıştırdıktan sonra, gerekli tüm kodların otomatik olarak oluşturulduğunu göreceksiniz.

NestJS Uygulaması İçin Otomatik Oluşturulan Kod

Ne kadar serin?

3. Veri yapısını tanımlama

Bir sonraki adım, varlığımızın yapısını tanımlayacak olan Dynamoose tarafından sağlanan Document sınıfını genişleten bir entity sınıfı oluşturmaktır.

user.entity.ts dosyasını açın ve aşağıdaki kodu yapıştırın.

 { Document } dosyasını 'dynamoose/dist/Document' dosyasından içe aktarın;

dışa aktarma sınıfı Kullanıcı Belgeyi genişletir {
  kimlik = 0;
  İsim = '';
}

Bu yapı iki amaca hizmet eder:

  • Diğer geliştiricilerin veri yapısına hızlı bir bakış atmasına yardımcı olur
  • TypeScript'in gücünü kullanarak alanları otomatik olarak önerir.

Bu adım isteğe bağlıdır, ancak kesinlikle tavsiye ederim!

4. Dynamoose veritabanı modellerini tanımlamak için şema oluşturma

Mongoose kütüphanesinin ayak izini takip eden Dynamoose, bir şema kavramını kullanarak veritabanı modellerini de tanımlar. Şema, DynamoDB tablomuzun anladığı bir veri modelinin tanımıdır.

Daha önce tartışıldığı gibi DynamoDB, veritabanı tablolarına yükleyebileceğimiz verileri kısıtlamaz. Ancak şemayı kullanarak istenen veri şeklini tanımlayabiliriz ve Dynamoose verilerimizin bu yapıya uygun olmasını sağlayacaktır.

Diğer bazı avantajlar şunlardır:

  • Bir alanı required olarak işaretleyebiliriz, bu da o alanın asla boş kalmamasını sağlar
  • Bir özelliğin type tanımlayabiliriz
  • Yuvalanmış nesnelerin yapısını tanımlayabiliriz
  • Bir alanın değerini doğrulamak için custom validation işlevi sağlayabiliriz
  • timestamps otomatik olarak oluşturabiliriz

Varlıklar dizininde yeni bir user.schema.ts dosyası oluşturalım ve aşağıdaki kodu buraya yapıştıralım.

 * 'dynamoose'dan dinamo olarak içe aktarın;

dışa aktarma const UserSchema = yeni dynamoose.Schema(
  {
    Kimlik: {
      Numara giriniz,
      hashKey: doğru,
      gerekli: doğru,
    },
    İsim: {
      tür: Dize,
      gerekli: doğru,
      dizin: {
          isim: nameIndex,
          küresel: doğru
      }
    },
  },
  {
    zaman damgaları: doğru,
  },
);

Burada neler olduğunu anlayalım:

  • Id alanı Number olarak belirtilir, bu nedenle burada herhangi bir anahtar iletemeyiz
  • Name alanı required , bu nedenle boş olması hataya neden olacaktır.
  • Name türü String , bu nedenle başka hiçbir veri türü oraya gidemez
  • Bizim için oluşturulanAt ve createdAt alanlarını otomatik olarak oluşturacak ve koruyacak olan timestamps özelliğini updatedAt .
  • Name alanında global index oluşturduk

Bu şeyler, gereksiz doğrulama işlevleri yazmadan gerçekleşti.

5. CRUD işlemleri oluşturma

Gerekli tüm CRUD işlemlerini oluşturacağımız user.service.ts dosyasını açalım.

İlk olarak, yerel bir dbInstance sahip olduğumuzdan emin olun ve onu kullanıcı bilgileriyle başlatın.

İdeal olarak, veritabanı mantığımızı korumak için ayrı bir user.repository.ts dosyası oluşturmak istediğimizi unutmayın. İş mantığı için genellikle hizmet sınıflarını kullanırız.

Basit olması için, şimdi DB işlemlerini hizmet sınıfının içine koyuyoruz.

 @Enjekte edilebilir()
dışa aktarma sınıfı UserService {
  private dbInstance: Model<Kullanıcı>;

  yapıcı() {
    const tabloAdı = 'kullanıcılar';
    this.dbInstance = dynamoose.model<Kullanıcı>(tableName, UserSchema);
  }

  //... kaba fonksiyonlar
}

Burada User modeliyle özel bir dbInstance ekliyoruz. Constructor içerisinde hangi tabloyu kullanmak istediğimizi belirleyip UserSchema burada sağlıyoruz.

Artık dbInstance hangi DynamoDB tablosuna erişileceğini ve beklenen veri türlerini biliyor.

kullanıcı oluşturma

Bir user oluşturmak için aşağıdaki fonksiyonu yazabiliriz.

 zaman uyumsuz oluştur (createUserDto: CreateUserDto) {
    dönüş bekle this.dbInstance.create({
      Kimlik: createUserDto.Id,
      Ad: createUserDto.Name,
    });
}

NestJS'nin bizim için önceden tanımladığı CreateUserDto request nesnesini kullandığımıza dikkat edin.

Bunun gibi bir şey görünecek:

 dışa aktarma sınıfı CreateUserDto {
  Kimlik Numarası;
  Ad: dize;
}

kullanıcı edinme

Tek bir kullanıcı elde etmek için, aşağıdaki gibi birincil anahtarı kullanarak veritabanını sorgulayabiliriz:

 zaman uyumsuz findOne(id: sayı) {
    dönüş bekliyor this.dbInstance.get({ Id: id });
}

Kısmi eşleşme veya daha küçük veya daha büyük operatörler gibi birçok şeyi kullanarak da sorgulama yapabilirsiniz. Daha fazla ayrıntıyı belgelerde bulabilirsiniz.

Bir kullanıcıyı güncelleme

user güncellemek için Dynamoose tarafından sağlanan bir update işlevi alıyoruz.

 zaman uyumsuz güncelleme(kimlik: sayı, updateUserDto: UpdateUserDto) {
    dönüş this.dbInstance.update({
      Yaptım,
      Ad: updateUserDto.Name,
    });
}

Bir kullanıcıyı silme

Bir kullanıcıyı kimliğe göre silmek için şu kodu girin:

 zaman uyumsuz kaldır(kimlik: sayı) {
    geri dön this.dbInstance.delete({ Id: id });
}

Son sürüm şöyle görünmelidir:

 * 'dynamoose'dan dinamo olarak içe aktarın;
{ Enjekte Edilebilir } '@nestjs/common'dan içe aktarın;
{ CreateUserDto } dosyasını './dto/create-user.dto'dan içe aktarın;
{ UpdateUserDto } dosyasını './dto/update-user.dto'dan içe aktarın;
{ Kullanıcı } dosyasını './entities/user.entity'den içe aktarın;
{ Model }'i 'dynamoose/dist/Model'den içe aktarın;
{ UserSchema } dosyasını './entities/user.schema' dosyasından içe aktarın;

@Enjekte edilebilir()
dışa aktarma sınıfı UserService {
  private dbInstance: Model<Kullanıcı>;

  yapıcı() {
    const tabloAdı = 'kullanıcılar';
    this.dbInstance = dynamoose.model<Kullanıcı>(tableName, UserSchema);
  }

  async create(createUserDto: CreateUserDto) {
    dönüş bekle this.dbInstance.create({
      Kimlik: createUserDto.Id,
      Ad: createUserDto.Name,
    });
  }

  zaman uyumsuz findOne(id: sayı) {
    dönüş bekliyor this.dbInstance.get({ Id: id });
  }

  zaman uyumsuz güncelleme(kimlik: sayı, updateUserDto: UpdateUserDto) {
    dönüş this.dbInstance.update({
      Yaptım,
      Ad: updateUserDto.Name,
    });
  }

  zaman uyumsuz kaldır(kimlik: sayı) {
    geri dön this.dbInstance.delete({ Id: id });
  }
}

6. Kullanıcı uç noktalarını test edin

Postman'e gidelim ve aşağıdaki gövdeyi kullanarak bir kullanıcı oluşturalım.

 bitiş noktası: http://localhost:3000/user
yöntem: POST
gövde: {
    "Kimlik": 1,
    "İsim" : "Faysal"
}

Belirli bir kullanıcıyı böyle elde etmeye çalışırsanız…

 uç nokta: http://localhost:3000/user/1
yöntem: GET

… size şu yanıtı verecektir:

 {
    "Kimlik": 1,
    "İsim": "Faysal",
    "createdAt": 1660504687981,
    "updatedAt": 1660504687981
}

İki ekstra alan olduğunu görebilirsiniz: otomatik olarak oluşturulan updatedAt createdAt

Benzer şekilde update ve delete yöntemleriyle de oynayabilirsiniz.

Artık Dynamoose kullanarak gerçek DynamoDB ile konuşabilen, tamamen çalışan bir CRUD uygulamanız var.

Son açıklamalar

Bu makalede, Dynamoose'u bir NestJS uygulamasıyla nasıl kullanacağınızı öğrendiniz. Bu proje için GitHub deposuna buradan göz atın. Nestjs-dynamoose adlı alternatif bir paket, kullanıma biraz sözdizimsel şeker ekler.

Umarım bugün yeni bir şey öğrenmişsindir. İyi günler!

Dynamoose ile Modeling NestJS uygulaması verileri ilk olarak LogRocket Blog'da göründü.

etiketlerETİKETLER
Üzgünüm, bu içerik için hiç etiket bulunmuyor.

Sıradaki içerik:

NestJS uygulama verilerini Dynamoose ile modelleme