Request Context Yönetimi: Middleware'de Veri Taşıma Tuzakları

# Request Context Yönetimi: Middleware'de Veri Taşıma Tuzakları

Middleware'de request bilgisini (kullanıcı ID, trace ID, authorization) bir yerden diğerine taşırken veri kaybı yaşanabiliyor. Özellikle asenkron işlemlerde context kaybolur ve yanlış veri kullanılır.

En yaygın hata, request context'i global bir değişkene atıp sonra başka requestin üzerine yazması. Aynı thread farklı requestleri işlerse, context karışır.

Yanlış Yaklaşım:

1// YANLIŞ: Global değişkene yazıyoruz
2let currentUserId = null;
3
4app.use((req, res, next) => {
5currentUserId = req.user.id; // Sorun: thread paylaştı
6next();
7});
8
9app.get('/profile', (req, res) => {
10// İki request aynı anda gelirse currentUserId karışır
11res.json({ userId: currentUserId });
12});

Çıktı: Kullanıcı A'nın isteği işlenirken Kullanıcı B'nin ID'si yazılırsa, yanlış veri döner.

Context'i request object'ine attach et. Her request'in kendi nesnesi vardır.

1app.use((req, res, next) => {
2req.userId = req.user.id; // Her request'in kendi özelliği
3req.traceId = generateId();
4next();
5});
6
7app.get('/profile', (req, res) => {
8console.log(`[${req.traceId}] Kullanıcı ${req.userId}`);
9res.json({ userId: req.userId });
10});

Çıktı:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1[abc123] Kullanıcı 42
2[def456] Kullanıcı 99

Her request'in kendi veri seti kalır.

Async/await kullanırken context thread pool'da değişebilir.

1app.use((req, res, next) => {
2req.userId = req.user.id;
3next();
4});
5
6app.get('/data', async (req, res) => {
7const userId = req.userId; // Şimdilik var
8
9// Database çağrısında thread değişebilir
10const data = await db.query('SELECT * FROM users WHERE id =?', [userId]);
11
12// Burada userId hala erişilebilir (aynı request object)
13res.json(data);
14});

Express/Node.js request object request boyunca yaşar, sorun yok.

Queue'ya iş gönderirken context'i de gönder.

1// YANLIŞ
2app.post('/send-email', (req, res) => {
3queue.add({ email: req.body.email });
4// req context queue'da erişilemez
5res.json({ ok: true });
6});
7
8// DOĞRU
9app.post('/send-email', (req, res) => {
10queue.add({
11email: req.body.email,
12userId: req.userId, // Context'i de gönder
13traceId: req.traceId
14});
15res.json({ ok: true });
16});

1. Global değişken kullanma: Context karışır
2. Request object'ine attach et: Her request'in kendi veri seti
3. Async işlemlerde: Request object yaşam süresi boyunca erişilebilir
4. Queue/background job: Context'i payload'a ekle

Middleware'de context yönetiminin anahtarı: "Her request'in kendi nesnesi vardır, bunu kullan."

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz