İçindekiler
- 1 DynamoDB ile ağrı noktaları
- 2 DynamoDB sorunlarına çözüm
- 3 ORM aracınız olarak neden Dynamoose'u seçmelisiniz?
- 4 Dynamoose ile NestJS uygulaması oluşturma
- 5 1. Dynamoose'u Yapılandırma
- 6 2. Kullanıcı uç noktalarının oluşturulması
- 7 3. Veri yapısını tanımlama
- 8 4. Dynamoose veritabanı modellerini tanımlamak için şema oluşturma
- 9 5. CRUD işlemleri oluşturma
- 10 6. Kullanıcı uç noktalarını test edin
- 11 Son açıklamalar
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:
- DynamoDB ile ağrı noktaları
- DynamoDB sorunlarına çözüm
- ORM aracınız olarak neden Dynamoose'u seçmelisiniz?
- Dynamoose ile NestJS uygulaması oluşturma
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.

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ı
requiredolarak işaretleyebiliriz, bu da o alanın asla boş kalmamasını sağlar - Bir özelliğin
typetanımlayabiliriz - Yuvalanmış nesnelerin yapısını tanımlayabiliriz
- Bir alanın değerini doğrulamak için
custom validationişlevi sağlayabiliriz -
timestampsotomatik 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:
-
IdalanıNumberolarak belirtilir, bu nedenle burada herhangi bir anahtar iletemeyiz -
Namealanırequired, bu nedenle boş olması hataya neden olacaktır. -
NametürüString, bu nedenle başka hiçbir veri türü oraya gidemez - Bizim için oluşturulanAt ve
createdAtalanlarını otomatik olarak oluşturacak ve koruyacak olantimestampsözelliğiniupdatedAt. -
Namealanı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ü.

Sohbete katıl0
Henüz yorum yok. İlk katkı senden gelsin.