Web'e gelen bütün değişiklikler belli bir komiteden geçip belli bir spesifikasyona göre dokümante ediliyor. Bu işlemler uzun sürüyor ve
geliştirme sürecinde kayda değer API değişiklikleri yaşanıyor. Browser vendor'ları henüz tamamlanmamış deneysel özellikler için özelliği
prefix'liyorlar, ki asıl özellik deneyselden çıktığında spesifikasyon çakışması olmasın. Belli özellikler çok uzun süre tartışıldığı için
vendor prefix'li koda dependency oluşuyor. Browser'lar da tam olarak kaldıramıyorlar. Örneğin Chrome transform
özelliğini şu anda
destekliyor, ama web'i bozmamak için prefix'li bir property desteği de sağlıyor olabilir.
Şimdi durum şöyle;
JavaScript'in çalışma biçimi biraz değişik. Kod tek bir thread'de çalıştığı için event-loop denilen bir mekanizmayla çalışıyor her şey.
Bunlar işin kompleks kısmı ama araştırma istersen diye yazayım dedim.
const axios = require('axios');
axios.get('https://jsonplaceholder.typicode.com/todos/1')
.then(res => {
console.log(res.data);
});
Burada yazdığın kod yukarıdan aşağıya doğru tek tek ve komut komut çalışacak. Öncelikle axios kütüphanesi import edilecek ve axios.get
fonksiyonu çalışacak. Axios'un internet üzerinden gidip herhangi bir kaynağı çekmesi uzun bir olay olabilir, bilgisayar ne
kadar süreceğiniz bilemez (internet hızına göre değişir sonuçta). Bu yüzden programı dondurmamak amacıyla bu işlemi yedeğe alıp diğer
komutlara devam eder.
const axios = require('axios');
let resp = {};
axios.get('https://jsonplaceholder.typicode.com/todos/1')
.then(res => {
resp = res.data;
});
console.log(resp);
Bu tarz bir yaklaşım mantıklı gelebilir sana ama sorununu çözmeyecektir. Sırayla komutları inceleyerek bakalım;
- Axios kütüphanesini import ettik
resp
adında bir değişken oluşturup, değerini boş bir nesneye atadık.axios.get()
fonksiyonunu çalıştırdık. Bu fonksiyonPromise
denen bir değer tipi döndürüyor.- Promise tipi süresini bilemeyeceğimiz asenkron işlemler için kullanılıyor.
- Fonksiyon üzerinde
.then()
çalıştırabileceğin yeni bir nesne döndürüyor. - İşlem tamamlandığında da içindeki komutları gerçekleştiriyor. O yüzden
.then()
kısmının içinde yaptığın hiçbir şey henüz gerçekleşmeyecek
resp
nesnesini konsola yazdırıyoruz.- Konsol çıktısı boş bir nesne olacaktır çünkü nesne ile hiçbir şey yapmadık.
axios.get()
fonksiyonu tamamlandı ve gerekli kaynak hazır.resp
değişkenini gelen cevaba atadık.- Ancak bu noktada program çoktan bitti. Elimizde de herhangi bir değer kalmadı.
Event loop ile ilgili ilginç bir durum var. Her bir asenkron işlem bir kuyruğa eklenip uygulanabilecek en erken zamanda işleniyor. Yani
eğer internet üzerinden istediğin kaynağı ışık hızında bile çeksen .then()
içindeki kısım programın bir sonraki tick
'inde çalışacak.
Bu da programın bittiği kısma denk geliyor. Ne yaparsak yapalım, cevabı promise dönen bir fonksiyondan hemen sonra .then()
kısmındaki
veriye ulamayız.
CEVAP ŞÖYLE;
Promise'i beklemen lazım. async/await
anahtar kelimeleri burda işimizi görecek. Öncelikle .then()
çağrısını kaldırıp await
anahtar kelimesi ile değiştireceğiz.
const axios = require('axios');
// then kısmındaki `res` değişkenini yukarı taşıyacağız.
const res = await axios.get('https://jsonplaceholder.typicode.com/todos/1')
// ^
Yapacağımız ikinci bir işlem daha var. await
anahtar kelimesi özel bir sentaks oluşturuyor, bunu sadece async
fonksiyonlarda
kullanabiliriz. async
fonksiyonlar da sadece başında async
anahtar kelimesini içeren fonksiyonlar. Bu yüzden programı bir
fonksiyonla sarmalayacağız.
Kodun son hali böyle olacak;
const axios = require('axios');
// asıl olayları sarmaladığımız fonksiyon
async function main() {
const res = await axios.get('https://jsonplaceholder.typicode.com/todos/1');
console.log(res.data);
}
// son olarak fonksiyonu çalıştıralım.
main();
Muhtemelen değiştiremezsin. JavaScript kendi başına sunucundaki dosyaya ulaşamayacağı için React build aşamasında ortam değişkenlerini statik bir şekilde veriyor. O yüzden JSON dosyası kullanmanın güvenlik açısından pek de farklı olacağını zannetmiyorum.
Şöyle bir yaklaşım da işine yarayabilir.
Giriş yapışında kullanıcıya 2 türlü token ver. Biri auth için, diğeri de eski token'ı yenilemek için. React üzerinden bir istek göndermeden önce token'ın vakti dolmuş mu kontrol et, eğer dolmuşsa backend'den refresh token ile yeni bir çift auth/refresh token iste.
npm'de html-to-markdown gibi işine yarayacak bir paket bulabilirsin, ama bence yazdılan markdown'u ham şekilde veritabanına kaydedip front-end html'e dönüştürmek hem daha mantıklı hem de düzenleme açısından daha kolay olabilir.
Bence doğru yoldasın. Algoritmayı oluşturmuşsun, uygulaması kalmış.
Kırılmadım sıkıntı yok :)
Ne demek istediğinizi anladım merak etmeyin.
Yanlış anlamadım, nasıl bir yer olduğunu biliyorum. Belki buraya uyar diye düşünmüştüm, belli ki uymamış kusura bakmayın. Soru kaldırma özelliği gelirse direkt kaldıracağım.
Sorunu tam anlayamadım ama rest api değil de web scraping gibi bir şeye ihtiyacın varsa
node js için npm'deki puppeteer paketine göz
atmanı öneririm. Diğer kısımlar algoritmana kalmış durumlar.