ws paketiyle WebSocket bağlantısı kurma
Öncelikle projenize istemci kütüphanesini ekleyin: npm install ws. Ardından const WebSocket = require("ws") ile içe aktarıp const ws = new WebSocket("wss://api.hasfiyat.com/stream?source=harem&token=" + process.env.ALTIN_API_KEY) çağrısıyla bağlantıyı başlatırsınız. Node.js 22 ve sonrasında yerleşik WebSocket sınıfı da aynı adresle çalışır. Anahtarı koda yazmak yerine ortam değişkeninden okumak güvenli bir alışkanlıktır.
Bağlantı yaşam döngüsünü olaylarla izlersiniz: ws.on("open", ...) bağlantı kurulduğunda, ws.on("close", (kod) => ...) koptuğunda ve ws.on("error", ...) ağ hatasında tetiklenir. Anahtar geçersizse ya da aktif paketiniz yoksa sunucu önce {"error": "..."} biçiminde bir mesaj gönderir, ardından bağlantıyı 1008 koduyla kapatır. Bu olayları loglamak, üretimde bağlantı sağlığını takip etmenizi kolaylaştırır.
ws paketi kendiliğinden yeniden bağlanmaz; close olayında kısa bir beklemeyle yeni bir bağlantı açan küçük bir fonksiyon yazarsınız. Bekleme süresini her denemede artırmak (örneğin 1, 2, 4 saniye, en fazla 30 saniye) ağı ve sunucuyu yormaz. Bunu Hasfiyat'ın çok kaynaklı failover altyapısıyla birleştirdiğinizde, hem istemci hem sunucu tarafında dayanıklı, kesintisiz bir fiyat kanalı oluşur.
Gelen fiyat listesini işleme
Hangi kaynağı dinleyeceğinizi bağlantı adresindeki source parametresiyle seçersiniz (harem, hakan, nadir, doviz gibi). Bağlantı açılır açılmaz o kaynağın tüm kalemlerini içeren bir liste gelir; sonrasında fiyat değiştikçe güncel liste yeniden gönderilir. Yalnızca bazı sembollerle ilgileniyorsanız gelen listeyi kendi tarafınızda süzersiniz.
Her mesaj ws.on("message", (m) => { const veri = JSON.parse(m); ... }) callback'ini tetikler. veri bir dizi ise her elemanda title (örneğin HAS ALTIN), buy ve sell alanları bulunur; değerler 6.421,99 gibi Türkçe biçimli metindir. Bu verileri doğrudan bir Express sunucusundan istemcilere yayabilir, Redis'e yazabilir veya bir mesaj kuyruğuna aktararak mikroservis mimarinize besleyebilirsiniz.
Yüksek trafikli bir uygulamada, WebSocket akışını tek bir Node.js süreci üzerinden alıp gelen tikleri kendi istemcilerinize dağıtmak (fan-out) yaygın bir mimaridir. Böylece binlerce kullanıcı için tek bir yukarı akış bağlantısı yeterli olur ve API kotanızı verimli kullanırsınız.
Kimlik doğrulama, REST ile birleştirme ve sembol kapsamı
Canlı akışta kimlik, bağlantı anında iletilen token ile doğrulanır; ayrıca tek seferlik sorgular için REST uç noktalarına Authorization: Bearer başlığıyla istek atabilirsiniz. Anahtarınızı .env dosyasında saklayıp process.env üzerinden okumak, dotenv gibi bir paketle Node.js projelerinde standart ve güvenli bir yöntemdir.
Pratikte iki yöntem birbirini tamamlar: uygulama açılışında REST ile mevcut fiyatların ilk halini (snapshot) çeker, ardından WebSocket akışıyla bu değerleri anlık olarak güncellersiniz. Bu desen, kullanıcı arayüzünüzün ilk saniyeden itibaren dolu görünmesini ve sonrasında canlı kalmasını sağlar.
Hasfiyat üzerinden gram ve has altın, çeyrek, ata ve cumhuriyet altını, ons XAU, gümüş, platin, paladyum, 22 ve 14 ayar değerleri ile USD, EUR, GBP pariteleri ve serbest piyasa alış/satış fiyatları dahil 67'den fazla sembole erişirsiniz. Kaydolup API anahtarınızı aldıktan sonra yukarıdaki ws örneğini çalıştırarak dakikalar içinde canlı akışı Node.js uygulamanıza bağlayabilirsiniz.
Sık sorulan sorular
Node.js ile Hasfiyat altın API'sinden fiyat nasıl çekilir?
Node.js 18+ ile yerleşik `fetch` kullanabilirsiniz: `await fetch(url, { headers: { Authorization: 'Bearer API_ANAHTARINIZ' } })` ardından `await res.json()` ile JSON'u okursunuz. Eski sürümlerde `node-fetch` veya `axios` tercih edilir. Anlık akış için ayrıca `ws` paketiyle (Node.js 22 ve sonrasında yerleşik `WebSocket` ile) bağlantı kurulur.
Node.js ile canlı fiyat akışına nasıl bağlanırım?
`npm install ws` ile paketi kurup `const ws = new WebSocket('wss://api.hasfiyat.com/stream?source=harem&token=API_ANAHTARINIZ')` ile bağlanın, `ws.on('message', m => { const veri = JSON.parse(m); })` ile gelen listeyi dinleyin. Bağlantı koptuğunda yeniden bağlanmayı `close` olayında kendiniz başlatırsınız. Bu yöntemle her fiyat değişiminde güncel liste size ulaşır.
Node.js'te fetch ile Authorization header'ını nasıl eklerim?
`fetch(url, { headers: { Authorization: 'Bearer API_ANAHTARINIZ' } })` şeklinde header nesnesini isteğe geçirirsiniz. WebSocket tarafında ise anahtar bağlantı adresindeki `token` parametresiyle gönderilir: `wss://api.hasfiyat.com/stream?source=harem&token=API_ANAHTARINIZ`. Anahtar her istekte doğrulandığından header eksikse 401 yanıtı dönersiniz.
Node.js ile altın alış ve satış fiyatını ayrı ayrı nasıl okurum?
JSON yanıtında her sembolün alış ve satış değerleri ayrı alanlarda geldiğinden `veri.data.find(k => k.title === 'HAS ALTIN')` ile bulduğunuz kalemin `buy` ve `sell` alanlarını ayrı okursunuz. Sarrafiye uygulamalarında makas önemli olduğu için ikisini birlikte göstermek yaygındır. Değerler ilgili kaynağın anlık kotasyonunu yansıtır.
Node.js'te fetch isteğinde hata yakalamayı nasıl yaparım?
İsteği `try/catch` bloğuna alın ve `if (!res.ok) throw new Error(res.status)` ile 4xx/5xx durumlarını kontrol edin; ağ hataları zaten `catch`'e düşer. `AbortController` ile zaman aşımı ekleyerek yanıt gecikirse isteği iptal edebilirsiniz. Böylece geçersiz anahtar veya bağlantı sorunlarında uygulamanız kontrollü davranır.
Node.js'te API anahtarımı .env ile nasıl güvenli tutarım?
Anahtarı koda yazmak yerine `.env` dosyasında saklayıp `dotenv` paketiyle `process.env.HASFIYAT_API_KEY` üzerinden okursunuz ve `.env`'i `.gitignore`'a eklersiniz. Anahtarı asla tarayıcıda çalışan istemci JavaScript'ine gömmeyin, çünkü orada herkese açık hale gelir. Sunucu tarafı Node.js kodunda tutmak en güvenli yoldur.
Node.js'te WebSocket yeniden bağlanmasını nasıl kurarım?
Bağlantıyı açan kodu bir fonksiyona alın ve `ws.on('close', () => setTimeout(baglan, bekleme))` ile kopmada yeniden çağırın; bekleme süresini her denemede iki katına çıkarıp 30 saniyeyle sınırlamak iyi bir varsayılandır. Başarılı bağlantıda (`open`) beklemeyi sıfırlarsınız. Sunucudaki çoklu-kaynak failover sayesinde ayrıca bir veri kaynağı düşse de akış devam eder.
Node.js'te yalnızca belirli sembolleri nasıl işlerim?
Akış seçtiğiniz kaynağın tüm kalemlerini gönderir; belirli sembolleri istemci tarafında süzersiniz: `const istenen = new Set(['HAS ALTIN', 'USD/TL'])` tanımlayıp `veri.filter(k => istenen.has(k.title))` ile yalnızca ilgilendiğiniz kalemleri ayırırsınız. REST tarafında ise `symbols` parametresiyle sunucudan doğrudan yalnızca bu kalemleri isteyebilirsiniz.
Node.js ile USD/TRY ve EUR/TRY kurlarını nasıl çekerim?
Döviz kurları aynı REST uç noktasından döner; harem kaynağında `USD/TL` ve `EUR/TL` başlıklı kalemlerin `sell` alanlarını okursunuz. API çapraz pariteleri (USD, EUR, GBP) ve serbest piyasa alış/satış kurlarını sağlar. Kripto para ve BIST verileri bu API kapsamında değildir.
Node.js'te 401 hatası alıyorum, nasıl düzeltirim?
401 genellikle Authorization header'ının eksik veya anahtarın geçersiz olduğunu gösterir; header'ı `Bearer API_ANAHTARINIZ` formatında ve anahtarın aktif olduğundan emin olun. `process.env` ile okuyorsanız `dotenv` yapılandırmasının en üstte çağrıldığını ve değişkenin dolu geldiğini `console.log` ile kontrol edin. Header'ı WebSocket tarafında `extraHeaders` altında verdiğinizi doğrulayın.
Node.js ile çeyrek, yarım ve tam altın fiyatını nasıl alırım?
Sarrafiye ürünleri ayrı sembollerle döndüğü için harem kaynağında `YENİ ÇEYREK`, `YENİ YARIM` ve `YENİ TAM` başlıklı kalemlerin alış-satış değerlerini okursunuz. API ata, cumhuriyet ve reşat çeşitlerini de kapsar. Her ürün için makası göstermek kullanıcıya değer katar.
Node.js'te axios ile fetch arasında hangisini seçmeliyim?
Node 18+ ile gelen yerleşik `fetch` çoğu durumda yeterlidir ve ek bağımlılık gerektirmez; ancak `axios` otomatik JSON çözme, interceptor ve daha kolay hata yönetimi sunar. Basit GET istekleri için `fetch`, karmaşık istemci mantığı için `axios` tercih edebilirsiniz. Her iki yöntemde de Authorization header'ını aynı şekilde eklersiniz.
Node.js'te ons altın (XAU) fiyatını nasıl alırım?
REST yanıtından ons altın sembolünü okuyarak `veri.data.find(k => k.title === 'ONS').sell` ile dolar bazlı XAU değerine ulaşırsınız. Bu değeri USD/TRY kuruyla çarparak gram altın çevrimi yapabilirsiniz. API 67'den fazla sembol arasında ons XAU'yu da canlı olarak sağlar.
Node.js'te WebSocket verisini bir React/Vue arayüzüne nasıl aktarırım?
WebSocket bağlantısını sunucu tarafı Node.js'te tutup gelen fiyatları kendi backend'inizden istemci arayüzüne WebSocket veya SSE ile iletmeniz güvenli yaklaşımdır; böylece API anahtarı tarayıcıya sızmaz. React/Vue tarafında bu iç kanalı dinleyip state'i güncellersiniz. Anahtarı asla doğrudan ön yüz koduna koymayın.
Node.js'te fiyat değişince Trendyol/Hepsiburada ürünlerini nasıl güncellerim?
WebSocket ile aldığınız güncel altın fiyatını hesaplayıp pazaryeri API'leri üzerinden ilgili ürünün fiyatını Node.js'te güncelleyebilirsiniz. Hasfiyat Trendyol, Hepsiburada, N11, Amazon, Çiçeksepeti ve Pazarama gibi pazaryerleriyle entegrasyona uygundur. Fiyat güncellemesini olay tetiklemeli yaparak makası ve ayar bilgisini doğru sembolden aldığınızdan emin olun.
Node.js'te webhook ile fiyat bildirimini nasıl alırım?
Express ile bir POST uç noktası açıp API panelinde bu URL'yi webhook olarak tanımlarsınız; fiyat olayları JSON gövdesiyle iletilir ve `req.body` ile okursunuz. Webhook, sürekli açık bağlantı yönetmek istemediğinizde WebSocket'e bir alternatiftir. Gelen isteği işlemeden önce beklenen sembol ve alan yapısını doğrulayın.
Node.js'te gümüş, platin ve paladyum fiyatını nasıl çekerim?
Değerli metal sembolleri REST yanıtında yer alır; gümüş, platin ve paladyum harem kaynağında `GÜMÜŞ TL`, `PLATİN ONS` ve `PALADYUM ONS` gibi başlıklarla gelir. API bu metalleri farklı kaynaklardan derleyip alış-satış olarak sunar. Kripto para bu kapsamın dışında olduğundan yalnızca fiziki metaller ve dövizler döner.
Node.js'te ayar bazlı (995, 916, 750, 585) altın değerlerini nasıl alırım?
Ayar bazlı fiyatlar kaynağın kendi başlıklarıyla gelir; örneğin harem kaynağında `22 AYAR` ve `14 AYAR` kalemleri bulunur. Kaynakta bulunmayan bir ayar için has altın fiyatını milyem oranıyla çarparak kendi hesabınızı yaparsınız. Her kalem için alış ve satış ayrı döner.
Node.js'te fetch'e zaman aşımı nasıl eklerim?
`AbortController` oluşturup `setTimeout` ile belirli süre sonra `controller.abort()` çağırın ve `fetch(url, { signal: controller.signal, headers })` şeklinde sinyali geçirin. Süre dolarsa istek iptal edilir ve `catch` bloğuna düşer. Böylece yanıt gecikmesinde uygulamanız takılıp kalmaz.
Node.js'te aynı anda birden fazla sembolü nasıl takip ederim?
WebSocket akışı kaynağın tüm sembollerini tek mesajda gönderir; birden çok sembolü takip etmek için gelen diziyi `title` alanına göre ayırmanız yeterlidir. REST tarafında ise tek GET isteğinde `symbols` parametresine virgülle birden çok sembol yazarak hepsini birlikte okuyabilirsiniz. Canlı fiyat panoları için WebSocket yaklaşımı daha akıcıdır.
Node.js'te bir kaynak düşerse fiyat almaya devam eder miyim?
Evet, sunucu tarafında kaynaklar arasında çoklu-kaynak failover çalışır; Harem, Hakan, Mayda gibi kaynaklardan biri düşerse fiyat otomatik diğerinden derlenir. Node.js istemciniz bunu fark etmeden aynı sembolden kesintisiz veri okumaya devam eder. Bu yüzden istemci tarafında ayrı kaynak yönetimi yazmanıza gerek yoktur.
Node.js'te 429 rate limit yerine WebSocket kullanmak neden daha iyi?
Sık aralıklarla REST GET atmak aylık istek kotanızı hızla tüketir (kota dolunca 429 döner) ve her istekte gecikme ekler; oysa WebSocket bağlantısı fiyat değiştikçe size veri iter, tekrar tekrar sormanız gerekmez. WebSocket akışı REST kotasından düşmediği için hem kotayı korur hem düşük gecikme sağlar. Sürekli canlı veri gereken panolarda WebSocket tercih edin.
Canlı altın & döviz verisine hemen bağlanın
Dakikalar içinde REST veya WebSocket ile gerçek zamanlı fiyat akışına başlayın.

