تكرار السؤال: …
الإجابة المختصرة
تحدث عندما يُنفذ استعلام رئيسي يتبعه N استعلام لكل سجل لجلب علاقاته؛ تحلها DataLoader بتجميع (Batching) وتخزين (Caching) الطلبات في استعلام موحد.
الشرح
شائعة جداً في واجهات GraphQL وREST المتداخلة. تقوم DataLoader باستغلال آلية الـ microtasks في Node.js؛ فعند طلب دالة loader.load(id) عدة مرات في نفس دورة الـ Event Loop، تجمع كل المعرفات في مصفوفة وتستدعي دالة دفعة واحدة batchFunction([1, 2, 3]) لتنفيذ استعلام SELECT WHERE id IN (...).
مثال بالكود
import DataLoader from "dataloader";
const userLoader = new DataLoader(async (ids) => {
const users = await db.query("SELECT * FROM users WHERE id = ANY($1)", [ids]);
return ids.map(id => users.find(u => u.id === id));
});أخطاء شائعة
- إعادة استخدام نفس كائن DataLoader عبر طلبات مستخدمين مختلفين مما يسرب البيانات المخزنة مؤقتاً.