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ıyoruz2let currentUserId = null;34app.use((req, res, next) => {5currentUserId = req.user.id; // Sorun: thread paylaştı6next();7});89app.get('/profile', (req, res) => {10// İki request aynı anda gelirse currentUserId karışır11res.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ği3req.traceId = generateId();4next();5});67app.get('/profile', (req, res) => {8console.log(`[${req.traceId}] Kullanıcı ${req.userId}`);9res.json({ userId: req.userId });10});Çıktı:
1[abc123] Kullanıcı 422[def456] Kullanıcı 99Her 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});56app.get('/data', async (req, res) => {7const userId = req.userId; // Şimdilik var89// Database çağrısında thread değişebilir10const data = await db.query('SELECT * FROM users WHERE id =?', [userId]);1112// 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şilemez5res.json({ ok: true });6});78// DOĞRU9app.post('/send-email', (req, res) => {10queue.add({11email: req.body.email,12userId: req.userId, // Context'i de gönder13traceId: req.traceId14});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."
0 yorum