Nodejs'de async/await kullanarak veritabanı işlemleri yapmak, uygulama performansını artırmak ve kod karmaşıklığını azaltmak için harika bir yöntemdir Bu yazıda, async/await'in nasıl kullanıldığını ve veritabanı işlemlerinde nasıl uygulanacağını öğreneceksiniz İlgilenen herkes bu yazıyı okuyarak Nodejs uygulamalarındaki veritabanı işlemlerindeki sorunlarını çözebilir

Node.js'de veritabanı işlemleri yapmak, asenkron yapıdaki sunucularla çalışırken oldukça önemlidir. Çünkü veritabanı bağlantıları, istemci isteklerinin gerçekleştirilmesi sırasında yapılması gereken işlemlerden biridir ve bu işlemler sırasında sunucu yavaşlayabilir. Bu nedenle Node.js'de veritabanı işlemlerini yapmak için Async/Await yöntemleri kullanarak yapılan işlemlerin hızlandırılması gereklidir.
Async/Await yöntemi, Node.js'de asenkron işlemlerin yapılandırılmasını kolaylaştırır ve kodların daha okunaklı hale getirilmesine yardımcı olur. Örneğin, veritabanına kayıt ekleme işlemi sırasında, Async/Await yöntemleri kullanılarak eklenen kaydın başarılı bir şekilde eklendiğine dair bir onay alındığında başka bir işlem gerçekleştirilir. Bu yapılandırma, veritabanı işlemlerini daha güvenli hale getirir ve hatanın orijinini daha iyi anlamamızı sağlar.
Node.js'de Veritabanı Bağlantısı Kurmak
Node.js, modern programlama dilleri arasında oldukça yaygınlaşmaya başlayan bir teknolojidir. Bu hızla artan popülaritesi, web tabanlı uygulamaların geliştirilmesine olanak sağlamasıydı. Node.js, modüler yapılar sunarak uygulamaların geliştirilmesinde oldukça kullanışlı bir yapıya sahiptir. Veritabanı işlemleri de web geliştiricilerinin sıkça başvurduğu bir konudur. Bu makalede, Node.js'de veritabanı bağlantısı kurmanın nasıl yapılacağı konusunda bilgi paylaşacağız. Veritabanına bağlanmak için hangi modülleri kullanmanız gerektiğini öğrenirken aynı zamanda bağlantı oluşturma işleminde Async/Await yöntemlerini kullanarak veriyi beklerken diğer işlemleri yapmanın önemini de vurgulayacağız.
Öncelikle, Node.js üzerinde veritabanı işlemleri yapmak için bir bağlantı oluşturmanız gerekiyor. Bunun için farklı modüller kullanılabilir. Örneğin, MongoDB ve Mongoose gibi çeşitli veritabanı modülleri kullanarak veritabanı işlemlerini gerçekleştirebilirsiniz. Bunları kurup yapılandırmak oldukça basit olduğu için burada ayrıntıya girmeden geçeceğiz.
Veritabanına bağlanmak için öncelikle veritabanı dizin yolunu belirtmek gerekiyor. Ardından, bağlantı URL’si ve diğer parametreleri giriyoruz. Ancak, veritabanına bağlanmak bazen uzun sürebilir ve Node.js'teki diğer işlemleri de etkileyebilir. Bu nedenle, Async/Await yapısının sağladığı faydaları kullanarak çok daha verimli bir yapı oluşturabiliriz. Bu sayede, bağlantı işlemi tamamlanana kadar diğer işlemleri yapabilir ve daha sonra bağlantı gerçekleştiğinde veriye ulaşabiliriz. Örneğin, aşağıdaki kodu kullanarak bir MongoDB veritabanına bağlanabilirsiniz:
Modül/Kütüphane | Açıklama |
---|---|
mongodb | MongoDB sürücüsü. |
mongoose | Olağanüstü düzenli bir MongoDB obje modelleme aracıdır. |
const mongoose = require('mongoose');const MONGODB_URI = 'mongodb://localhost:27017/veritabani';(async () => { try { await mongoose.connect(MONGODB_URI, { useNewUrlParser: true, useUnifiedTopology: true }); console.log('Veritabanı bağlantısı oluşturuldu'); } catch (e) { console.error(e); }})();
Yukarıdaki örnek kodda, MongoDB veritabanına bağlanmak için kullanılan bir yapı gösterilmiştir. Veritabanı bağlantısı oluşturulurken Async/Await yöntemleri kullanılarak bağlantı işlemi tamamlanana kadar diğer işlemler yapılabilir. Bununla birlikte, veritabanına bağlandığınızda gerçekleştirebileceğiniz işlemler kadar farklı işlemleri de yapabilirsiniz.
MongoDB'te Veritabanı İşlemleri Yapmak
Node.js'de veritabanı işlemlerini yapmanın bir yolu da MongoDB kullanmaktır. Bu örnekte, MongoDB kullanarak Async/Await yapısı kullanılarak veritabanı işlemleri yapabilirsiniz.
Örneğin, MongoDB veritabanına kayıt eklemek için aşağıdaki kodu kullanabilirsiniz:
async function kayitEkle(kayit) { try { await Client.connect(); const database = Client.db("veritabaniadi"); const collection = database.collection("collectionadi"); const result = await collection.insertOne(kayit); console.log(`${result.insertedCount} kayıt eklendi.`); } catch(err) { console.log(err); } finally { await Client.close(); }}
Burada, veritabanına bağlanmak için Client modülü kullanılır ve Async/Await yapısı kullanarak insertOne fonksiyonu kullanılarak kayıt eklenir. Hata durumunda catch bloğu çalışacaktır.
Bunun gibi, MongoDB'de veritabanı işlemleri yapmak için diğer örnekler:
- Kayıt Güncelleme: Async/Await yapısını kullanarak veritabanındaki bir kaydı güncelleyin.
- Birden Fazla Kayıt Ekleme: Birden fazla kaydı Async/Await yapısı kullanarak veritabanına ekleyin.
- Silme İşlemi Yapma: Veritabanından kayıt silmek için Async/Await kullanarak örnek kodlar.
Yukarıda verilen tüm örneklerde, Async/Await yapısı kullanılarak veritabanı işlemleri yapılabilir. Bu yöntemler, Node.js'de veritabanı işlemlerini daha okunaklı ve anlaşılır hale getirebilir. Hataları yakalamak ve işlemi daha hızlı hale getirmek için de büyük bir avantaj sağlar.
Kayıt Eklemek ve Güncellemek İçin Async/Await Kullanmak
Node.js kullanarak asenkron şekilde veritabanı işlemlerinin yapılabilmesi Async/Await yapısı ile mümkündür. Bu yapı sayesinde kodların okunaklılığı ve yönetilebilirliği artar. Bu bölümde, Async/Await yapısını kullanarak veritabanına kayıt eklemek ve var olan bir kayıdı güncellemek için örnek kodlar verilecektir.
Örneğin, MongoDB kullanılarak verilerin eklenmesi ve güncellenmesi işlemleri yapılırken, Async/Await kullanımı aşağıdaki örnek şeklinde gerçekleştirilir:
KOD |
---|
try { const kayit = new Kayit({ ad: 'John', soyad: 'Doe' }); const yeniKayit = await kayit.save(); console.log(yeniKayit);} catch (error) { console.log(error.message);} |
try { const guncellenecekKayit = await Kayit.findByIdAndUpdate( { _id: '602001eeb2155f2b8c88dc8e' }, { ad: 'Jane', soyad: 'Doe' }, { new: true } ); console.log(guncellenecekKayit);} catch (error) { console.log(error.message);} |
Bu örnek kodlarda, kayıt eklemek için yeni bir Kayit oluşturulur ve save() metodu kullanılarak kaydedilir. Bu işlem sonrasında yeni kaydın tüm bilgileri console.log() ile ekrana yazdırılır. Güncelleme işlemi için ise findByIdAndUpdate() metodu kullanılarak kaydın MongoDB ID'si kullanılarak güncelleme işlemi yapılır ve sonuç olarak güncellenmiş kaydın tüm bilgileri console.log() ile ekrana yazdırılır.
Birden fazla kaydın eklenmesi veya güncellenmesi durumunda, Promise.all() kullanılabilir. Bu yapı birden fazla asenkron işlemin sonucunu Promise nesnesi olarak döndürür ve herhangi bir hata oluşması durumunda hata ile ilgili bilgiyi yakalar.
-
Örneğin birden fazla kayıt eklemek için:
try { const kayitlar = [ { ad: 'John', soyad: 'Doe' }, { ad: 'Jane', soyad: 'Doe' } ]; const sonuclar = await Promise.all( kayitlar.map(async (kayit) => { const yeniKayit = new Kayit(kayit); return await yeniKayit.save(); }) ); console.log(sonuclar);} catch (error) { console.log(error.message);}
-
Örneğin birden fazla kaydı güncellemek için:
try { const kayitlar = [ { _id: '602001eeb2155f2b8c88dc8e', ad: 'John', soyad: 'Doe' }, { _id: '602001eeb2155f2b8c88dc8f', ad: 'Jane', soyad: 'Doe' } ]; const sonuclar = await Promise.all( kayitlar.map(async (kayit) => { const guncellenecekKayit = await Kayit.findByIdAndUpdate( { _id: kayit._id }, { ad: kayit.ad, soyad: kayit.soyad }, { new: true } ); return guncellenecekKayit; }) ); console.log(sonuclar);} catch (error) { console.log(error.message);}
Async/Await yapısı ile veritabanı işlemleri yapıldığında kodların daha okunaklı olduğu ve hataların daha kolay tespit edildiği görülebilir. Bu nedenle, Node.js kullanırken Async/Await yapısını kullanmanız önerilir.
Birden Fazla Kaydı Ekleme ve Güncelleme
Async/Await yapısı, Node.js'de birden fazla kaydı eklemek veya güncellemek için de kullanılabilir. Bu işlemi gerçekleştirirken bir fonksiyonun sonucunu beklemek için Promise.all() yöntemi kullanabilirsiniz. Bu yöntem, birden fazla Async fonksiyonunu aynı anda çağırmanıza izin verir ve sonuçların tamamının dönüşünü bekler.
Promise.all(), birkaç farklı Promise nesnesini alır ve bunları tek bir Promise nesnesi olarak geri döndürür. Bu yeni Promise nesnesi, argüman olarak iletilen Promise nesnelerinden herhangi birinin reddedilmesi durumunda derhal reddedilir. Aksi takdirde, tüm Promise nesnelerinin çözüldüğü durumda çözümlenecektir.
Async/Await kullanarak örneğin birden fazla kaydı güncellemek için Promise.all() yöntemini kullanarak aşağıdaki örnek kodu kullanabilirsiniz:
Kod Parçası | Anlamı |
---|---|
| Birden fazla kayıtta güncelleme yapmak için Async/Await deliklerini kullanan örnek kod parçası. |
Bu örnek kod parçasında, updateMultipleRecords() isimli bir fonksiyon, bir "records" parametresi alır. Bu "records" parametresi bir dizi kaydı temsil eder. Döngü içinde her bir kaydın güncellenmesi için yeni bir Promise nesnesi oluşturulur. Tüm Promise nesneleri, Promise.all() yöntemiyle tek bir Promise nesnesi olarak birleştirilir. Fonksiyon, tüm kayıtlar güncellendiğinde tamamlanır.
Bu örneğin yanı sıra, bir dizi kayıtta birden fazla ekleme yapmak için de benzer bir yöntem kullanılabilir.
- MongoDB'de birden fazla kaydı eklemek veya güncellemek için Async/Await deliklerini kullanabilirsiniz.
- Promise.all(), birden fazla Async fonksiyonunu aynı anda çağırmak için kullanışlıdır.
Silme İşlemi Yapmak
Bir veritabanı işleminin olmazsa olmazlarından biri kayıt silme işlemidir. Node.js'de de, Async/Await kullanarak bu işlemi kolaylıkla gerçekleştirebilirsiniz. Kayıt silme işlemi tamamlandığında geriye ne tip bir değer döneceği merak ediyorsanız, try-catch blokları kullanarak hatayı yakalayabilirsiniz.
Örnek kodlarımızda, "deleteOne" ve "deleteMany" işlemleri kullanarak tek bir ya da birden fazla kaydı silme işlemini gerçekleştireceğiz. Aşağıdaki kod örneğinde, "deleteOne" işlemi kullanarak "users" koleksiyonundan "username"i "demouser" olan bir kaydı siliyoruz:
try { const result = await db.collection('users').deleteOne({ username: 'demouser' }); console.log(`${result.deletedCount} kayıt silindi.`);} catch (error) { console.error(error);}
Eğer silinmek istenen kayıt, birden fazla bulunuyorsa, "deleteMany" işlemi kullanılabilir. Aşağıdaki örnekte, "users" koleksiyonundaki "status"i "inactive" olan tüm kayıtlar silinmektedir:
try { const result = await db.collection('users').deleteMany({ status: 'inactive' }); console.log(`${result.deletedCount} kayıtlar silindi.`);} catch (error) { console.error(error);}
Silme işlemini gerçekleştirirken, belirli bir hatayı yakalamak ve nasıl baş edileceğini öğrenmek için try-catch bloklarını kullanabilirsiniz. Örneğin, "deleteOne" yöntemi kullanılarak silme işlemi gerçekleştirilirken, kayıt bulunamaması durumunda "result" nesnesi "null" olarak dönecektir. Bu durumu ele almak için aşağıdaki gibi bir try-catch bloğu kullanabilirsiniz:
try { const result = await db.collection('users').deleteOne({ username: 'unknownuser' }); if (result.deletedCount === 0) { throw new Error("Kayıt silinemedi."); } console.log(`${result.deletedCount} kayıt silindi.`);} catch (error) { console.error(error);}
Silme işleminde, hataları doğru şekilde ele almak ve içeriği düzgün şekilde kontrol etmek son derece önemlidir. Async/Await yapısını kullanarak gerçekleştirdiğiniz işlemlerde, hatayla başa çıkmak için try-catch bloklarının kullanımı standarttır.
Verileri Getirme İşlemi Kullanmak için Async/Await
Veritabanından veri çekme işlemi, web uygulamalarında en sık kullanılan işlemlerden biridir ve Node.js gibi modern teknolojilerde hızlı bir şekilde gerçekleştirilir. Ancak, verilerin çoklu sayfalara veya farklı uygulama bileşenlerine aktarılması gerektiğinde, özellikle büyük veri kümeleri söz konusu olduğunda, bu işlem oldukça yavaş olabilir.
Async/Await yapısının kullanılması, Node.js developer'larına verileri hızlı bir şekilde almak için bir çözüm sunar. Bu yöntem, işlem tek bir thread'de gerçekleştirildiğinden, veritabanından gelen tüm veriler istemciye daha hızlı bir şekilde aktarılabilir ve beklenmedik gecikmeler minimize edilir.
Bunun yanı sıra, Async/Await yöntemleri ile veri çekme işlemi, daha okunaklı ve yönetilebilir hale getirilir. Öncelikle, async işlevler ve await anahtar kelimesi kullanarak ifade etmek istediğiniz işlemleri daha net bir şekilde belirleyebilirsiniz. Bu, kodun daha anlaşılır olmasını sağlar ve kod hatası yapma riskini azaltır.
Örneğin, bir önceki MongoDB örneğinde, veriler birden fazla sayfaya bölündüğünde veya daha sonra kullanılacak uygulama bileşenlerinde kullanılmak üzere depolanacağında, Async/Await kullanarak verileri içe aktarabilirsiniz. Bu yöntem, daha hızlı yükleme süreleri ve kullanıcı deneyiminde iyileştirmeler sağlar.
Sorgu Türü | Kod Örneği |
---|---|
Veri Getirme | async function getUser(id) { |
Veri Filtreleme | async function getActiveUsers() { |
- Veri almak için
findById()
async fonksiyonu kullanılarak, kullanıcının veritabanından hızlı bir şekilde getirilmesi sağlanır. - Bir kullanıcı dizisini filtrelemek için
find()
async fonksiyonu kullanılarak, kullanıcının durumuna göre filtrelenmesi sağlanır.
Async/Await yapısını kullanarak verileri çekme işleminin avantajları, yüksek trafikli uygulamalarda daha belirgin hale gelir. Veriler hızlı bir şekilde alınır, beklenmedik gecikmeler önlenebilir ve hatasız bir kod yazmayı kolaylaştırır. Bu nedenle, Node.js uygulamalarında veri çekme işlemleri yaparken, Async/Await yapısını kullanmanızı öneririz.
Sıralamasız Verileri Almak
Node.js ile veritabanı işlemlerini gerçekleştirdiğimizde sıralamasız verileri almak veya istediğimiz şekilde filtrelemek sıklıkla karşılaştığımız senaryolardan biridir. Bu gibi durumlarda Async/Await yapısından yararlanarak verileri istediğimiz şekilde alabiliriz.
Örnek bir senaryo üzerinden ilerleyecek olursak; diyelim ki bir e-ticaret sitesinde müşteriden gelen ürün yorumları MongoDB veritabanına kaydediliyor ve yorumların tarih bilgisi de kaydediliyor. Bu durumda en son gelen yorumları belirli bir sayıda almak için aşağıdaki Async/Await yapısını kullanabiliriz:
Kodu | Açıklama |
---|---|
const sonYorumlar = async () => { const db = await MongoClient.connect(url); const veritabani = db.db(dbName); try { const yorumlar = await veritabani.collection("yorumlar").find().sort({_id:-1}).limit(10).toArray(); console.log(yorumlar); } catch (err) { console.log(err.stack); } db.close();} | Bu kod bloğunda ilk olarak MongoDB veritabanı bağlantısı kuruluyor. Daha sonra try/catch yapısıyla son 10 yorumu çekmek için find(), sort() ve limit() fonksiyonları kullanılıyor. Son olarak yorumlar değişkeni döndürülüyor ve işlem tamamlanıyor. |
Yukarıdaki örnekte Async/Await yapısı ile veritabanından son 10 yorum sıralamasına göre alınmaktadır. Bunun yanı sıra, diğer filtreleme seçenekleri, örneğin belli bir tarihten sonrası gibi, try/catch bloğu içerisinde çağrılabilir ve Async/Await yapısından faydalanabilirsiniz.
Gruplandırılmış Verileri Almak
Gruplandırılmış verileri almak, veritabanından bir alanda aynı değere sahip tüm verileri getirmek için kullanışlı bir yöntemdir. Bu işlemi yapmak için Async/Await yapılarını kullanarak oldukça kolay bir şekilde yapabilirsiniz.
Aşağıdaki örnek kod, MongoDB'den gruplandırılmış verileri getirir. Bu örnekte, "city" alanına göre gruplandırılmış verilerin sayısı alınmıştır:
```javascriptasync function getGroupedData() { const data = await ModelName.aggregate([ { $group: { _id: '$city', count: { $sum: 1 } } } ]); return data;}```
Yukarıdaki kod, "ModelName" koleksiyonundaki "city" alanına göre gruplandırılmış verileri sayı olarak getirir. "$group" keyword'ü, gruplama işleminin gerçekleştirileceği alana göre belirtilir. "_id" alanı, gruplama işlemi için kullanılacak olan anahtar kelime olarak belirlenir ve başka bir alan yerine kullanılabilir. "$sum" ise belirtilen alandaki tüm değerleri toplar.
Bu yöntemi kullanarak istediğiniz herhangi bir alana göre gruplandırılmış verileri alabilirsiniz.
Veritabanı İletişiminde Hata Yakalama
Node.js'de veritabanı işlemleri yaparken hatalar oluşabilir. Bu nedenle, hata yakalama işlemi önemlidir ve ne olursa olsun işlem akışının devam etmesini sağlar. Bununla birlikte, Async/Await kullanımı hata yakalamayı daha kolay hale getirir. Çünkü hata ile karşılaşıldığında, hatayı özelleştirebilir ve işlemin devam etmesine karar verebilirsiniz.
Async/Await ile hata yakalamak için try-catch kullanımı oldukça yaygındır. Bunun yanı sıra, Promise yapısı kullanarak da hata yakalama yöntemi uygulanabilir. Örneğin, Promise yapısı içinde bir catch bloğu oluşturarak hataların nasıl ele alınacağını belirleyebilirsiniz.
Bir diğer önemli husus da hata mesajlarının ne kadar özgün ve anlaşılır olduğunu kontrol etmektir. Hata mesajlarınızı açıklayıcı yapmak, hataların çözülmesinde çok önemli bir etmendir. Veritabanı işlemlerinde hatalar, çoğu zaman gelen verinin doğru formatta olmamasından kaynaklanır. Bu nedenle, gelen verinin işlenmesi sırasında oluşabilecek hataları öngörebilmek ve bunları özelleştirerek çözmek oldukça önemlidir.
Hataların Ele Alınması | Açıklama |
---|---|
try-catch Kullanma | Veritabanı işlemlerindeki hataları ele almak için en yaygın kullanılan yöntemdir. try-catch yapısı kullanarak hatanın oluştuğu kod bloğunu belirleyebilir ve oluşan hatayı özelleştirebilirsiniz. |
Promise ile Hata Yakalama | Promise yapısı kullanarak hataların nasıl ele alınacağını belirleyebilirsiniz. Promise yapısı içinde bir catch bloğu oluşturarak hataların çözülmesini sağlayabilirsiniz. |
Hata Mesajlarını Özelleştirme | Hata mesajlarınızı açıklayıcı hale getirerek, hata çözüm sürecini hızlandırabilirsiniz. Gelen verinin doğru formatta olup olmadığını ve işlenmesi süresince oluşabilecek hataları öngörerek, hata mesajlarınızı özelleştirebilirsiniz. |
Veritabanı işlemlerinde hata yakalama işlemi, oluşabilecek hataların en aza indirilmesi ve hata mesajlarının özelleştirilmesi gibi hususlar dikkatle ele alınmalıdır. Bu sayede, Node.js'de veritabanı işlemleri yaparken daha güvenli ve sağlam bir yapı kurabilirsiniz.
Sonuç Olarak
Node.js'de veritabanı işlemleri yaparken Async/Await yöntemini kullanmanın birçok avantajı vardır. İlk olarak, veritabanı işlemleri asenkron olarak gerçekleştirildiği için, diğer işlemlere devam ederken veritabanına gönderilen isteklerin tamamlanmasını beklemek zorunda kalmazsınız. Bu da programınızın daha hızlı ve verimli çalışmasını sağlar.
Async/Await yapısının bir başka avantajı, kodun daha okunaklı hale gelmesidir. Veritabanı işlemleri genellikle çok sayıda Promise ve geri çağrı fonksiyonları kullanarak gerçekleştirilir. Ancak, Async/Await kullanarak bu işlemleri daha sade ve anlaşılır hale getirebilirsiniz. Bunun yanı sıra, hataları daha kolay yönetebilirsiniz ve hatanın nerede oluştuğunu daha hızlı tespit edebilirsiniz.
Async/Await yapısının bir diğer avantajı ise uygulama akışınızı daha iyi yönetmenize yardımcı olmasıdır. Veritabanı işlemleri uzun sürebilir ve diğer işlemleri engelleyebilir. Ancak, Async/Await yapısı kullanarak veritabanı işlemlerini diğer işlemlerle bir arada yürütebilirsiniz. Bu sayede, daha verimli bir uygulama akışına sahip olabilirsiniz.