Kural
Kaçın istenmeyen küresel değişken önbelleklemeden kaçının. Node.js'de Node.js
ve Python sunucularda, global değişkenler kalıcı istekler
istekler arasında bu da veri sızıntılarına ve yarış koşullarına yol açar.
Desteklenen diller: JavaScript, TypeScript, PythonGiriş
Node.js sunucularındaki küresel değişkenler, yalnızca tek bir istek süresince değil, işlemin ömrü boyunca kalıcıdır. İstek işleyicileri kullanıcı verilerini küresel değişkenlerde sakladığında, bu verilere farklı kullanıcılardan gelen sonraki istekler de erişebilir. Bu durum, kullanıcı A’nın oturum verilerinin, kimlik doğrulama belirteçlerinin veya kişisel bilgilerinin kullanıcı B’ye sızmasına yol açan güvenlik açıkları yaratır.
Neden önemli?
Güvenlik riskleri (veri sızıntıları): Kullanıcıya özgü verileri önbelleğe alan küresel değişkenler, istekler arası veri sızıntılarına yol açar. Bir kullanıcının kimlik doğrulama durumu, oturum verileri veya kişisel bilgileri diğer kullanıcılar tarafından görülebilir hale gelir; bu da gizlilik ve güvenlik sınırlarını ihlal eder.
Yarış durumları: Birden fazla eşzamanlı istek aynı küresel değişkeni değiştirdiğinde, öngörülemeyen davranışların ortaya çıkma olasılığı yüksektir. İşlem sırasında Kullanıcı A’nın verileri, Kullanıcı B’nin isteği tarafından üzerine yazılabilir; bu da hatalı hesaplamalara, bozuk duruma veya kullanıcıların birbirlerinin verilerini görmesine yol açabilir.
Hata ayıklama karmaşıklığı: Küresel değişken önbelleklemesinden kaynaklanan sorunların yeniden canlandırılması, istek zamanlamasına ve eşzamanlılığa bağlı olması nedeniyle bilindiği üzere oldukça zordur. Bu hatalar, yük altındaki üretim ortamında aralıklı olarak ortaya çıkar, ancak tek iş parçacıklı geliştirme testlerinde nadiren görülür.
Bellek sızıntıları: Temizlenmeden veri biriktiren küresel değişkenler, zamanla sınırsız bir şekilde büyür. Her istek, küresel önbelleklere veya dizilere daha fazla veri ekler; bu da sonunda sunucu belleğini tüketir ve işlemlerin yeniden başlatılmasını gerektirir.
Kod örnekleri
❌ Uygun değil:
let currentUser = null;
let requestData = {};
app.get('/profile', async (req, res) => {
currentUser = await getUserById(req.userId);
requestData = req.body;
const profile = await buildUserProfile(currentUser);
res.json(profile);
});
function buildUserProfile(user) {
return {
name: currentUser.name,
data: requestData
};
}
Neden yanlış: currentUser ve requestData küresel değişkenleri, istekler arasında kalıcıdır. Birden fazla istek eşzamanlı olarak yürütüldüğünde, kullanıcı A’nın buildUserProfile() işlevi hâlâ yürütülürken kullanıcı B’nin isteği currentUser değişkenini üzerine yazabilir ve bu da kullanıcı A’nın kullanıcı B’nin verilerini görmesine neden olabilir.
✅ Uygunluk:
app.get('/profile', async (req, res) => {
const currentUser = await getUserById(req.userId);
const requestData = req.body;
const profile = buildUserProfile(currentUser, requestData);
res.json(profile);
});
function buildUserProfile(user, data) {
return {
name: user.name,
data: data
};
}
Bunun önemi: İsteğe özgü tüm veriler, istek işleyicisinin kapsamına giren yerel değişkenlerde saklanır. Her isteğin, diğer eşzamanlı isteklere sızamayacak şekilde izole edilmiş bir durumu vardır. İşlevler, küresel duruma erişmek yerine parametreler aracılığıyla veri alır; bu da yarış koşullarını ortadan kaldırır.
Sonuç
Tüm istekle ilgili verileri yerel değişkenlerde veya çerçevenizin sağladığı istek nesnelerinde saklayın. Küresel değişkenleri yalnızca yapılandırma, bağlantı havuzları veya salt okunur önbellekler gibi gerçekten paylaşılan durumlar için kullanın. Küresel durumun gerekli olduğu durumlarda, uygun eşzamanlılık denetimleri kullanın ve verilerin hiçbir zaman kullanıcıya özgü olmamasına dikkat edin.

