GraphQL / المتوسط: السياسة والمصادر والعملاء / الدرس 10
هوية العميل والتخزين المؤقت وتسوية الحالة
اربط سجلات العميل الموحدة بهوية ثابتة وميز تحديث الكيان عن عضوية القائمة.
في هذه الصفحة
أهداف الدرس
- اشرح دور النوع والهوية في مفاتيح المخبأ الموحد.
- سو الكتابة والتصفح وتغير المستخدم بقواعد حداثة واضحة.
سم المخبأ قبل مناقشة إبطاله
قد توجد مخابئ لوثائق محللة ومحملات الطلب ورد الخادم وHTTP ومخزن العميل الموحد، ولكل مفتاح وعمر. يجمع مخزن الكيان عادة النوع الفعلي والمعرف الثابت، وتعتمد نتائج الاستعلام على الوسائط والسياسة. لا يضيف تحديث كيان عضويته لكل قائمة أو يحذفها عند تغير شرطها. حدد الطبقة القديمة قبل مسح الكل أو ادعاء أن المعرف يحل الإبطال.
استعمل اتفاق هوية محلياً يمنع التصادم
يميز النموذج Course c1 عن Author c1 باستعمال __typename وid. يفيدان العميل الموحد لكن ضبط المخبأ يعتمد المكتبة. قد تدمج كائنات بلا هوية ثابتة محلياً لا عالمياً. لا تستخرج الهوية من عنوان قابل للتعديل. إن كان المعرف فريداً داخل المستأجر فقط فاعكس النطاق أو استبدل المخزن كله عند تبدل المستأجر.
function entityKey(value) {
return `${value.__typename}:${value.id}`;
}
const course = {__typename:"Course",id:"c1",title:"Graph foundations"};
const author = {__typename:"Author",id:"c1",displayName:"Lina"};
console.assert(entityKey(course) === "Course:c1");
console.assert(entityKey(course) !== entityKey(author));
للكائنين مفتاحان مختلفان رغم اشتراك id. هو اتفاق محلي لا مخبأ عميل مضبوط.
افصل وجود القيمة عن صلاحيتها الزمنية
لا يثبت وجود السجل محلياً أنه يعكس سياسة الخادم أو المصدر الحالية. حدد هل يعرض كل مشهد المخبأ فوراً أو يحتاج قراءة حديثة أو يعرض القديم أثناء التحديث. تحتاج حالة الصلاحيات غالباً صرامة أكثر من عنوان وصفي. تقاعد بيانات المستخدم عند الخروج أو تبدل الهوية قبل ظهورها للآخر. امنع النتائج الخاصة من HTTP المشترك إلا بسياسة ومفاتيح تحفظ الجمهور.
أعد هوية كافية لتحديث معتمد
قد تعيد طفرة التسمية هوية Course وعنوانه المعتمد ليحدث العميل مراجع الكيان. لا تصلح العملية تلقائياً ترتيب بحث بحسب العنوان أو قائمة مرشحة ببادئته؛ قد تحتاج تحديثاً مقصوداً أو إعادة قراءة محدودة. التحديث المتفائل توقع مؤقت يحتاج هوية وسياسة تراجع وتسوية، ولا يثبت نجاحه تفويض فعل حساس أو حفظه.
mutation Rename($input: RenameCourseInput!) {
renameCourse(input: $input) {
course { __typename id title }
problems { code field }
}
}
يفترض الجزء أنواعاً متوافقة. قد تحدث الهوية المراجع وتبقى عضوية القوائم المرشحة مسألة منفصلة.
ادمج الصفحات داخل نطاق الوسائط نفسه
يجب أن تميز مخابئ الصفحات التصفية والترتيب والهوية. يخلط ضم كل صفحات courses بمفتاح واحد المؤرشف بالمنشور أو يكرر الحدود. عرف دمجاً يحترم المؤشرات ويزيل التكرار بالهوية عند اللزوم. اختبر إعادة الترتيب والحذف والخروج وفشل التفاؤل وتبدل المرشح أثناء الطلب. لا يملأ رد متأخر لهوية قديمة عرض الهوية الجديدة لمجرد اكتمال الشبكة.
الأخطاء الشائعة وإصلاحها
تكتب سجلات المقرر والمؤلف فوق بعضها
- لماذا يحدث؟
- اعتمد المفتاح على ID معاد محلياً فقط.
- كيف تصلحه؟
- أدرج النوع الفعلي ونطاق المستأجر اللازم.
- كيف تتجنب تكراره؟
- اختبر المعرف نفسه عبر أنواع ومستأجرين.
يبقى مقرر معاد التسمية بقائمة خاطئة
- لماذا يحدث؟
- افترض أن التوحيد يعيد حساب عضوية القائمة.
- كيف تصلحه؟
- طبق تحديث قائمة مراجعا أو أعد قراءتها المحدودة.
- كيف تتجنب تكراره؟
- اختبر الحقول المؤثرة في التصفية والترتيب.
تظهر بيانات القديم بعد الخروج
- لماذا يحدث؟
- عاش المخبأ والطلبات بعد الهوية.
- كيف تصلحه؟
- تقاعد المخبأ وارفض ردود الهوية القديمة.
- كيف تتجنب تكراره؟
- اختبر تبديل الهوية والطلبات معلقة.
اختبر فهمك
1. هل يصلح رد id وtitle كل القوائم المرتبة بالعنوان؟
اعرض الحل المشروح
لا، قد يحدث العنوان أينما أُشير للكيان وتبقى المواضع والعضوية. راجع سياسات الحقول وحدث القوائم المحدودة أو أعد قراءتها. اختبر اسماً ينقل السجل عبر حد الصفحة لا ما يحفظ الترتيب فقط.
2. لماذا يهدد الرد المتأخر بعد تبديل الحساب الصحة؟
اعرض الحل المشروح
صدر الطلب لهوية سابقة وأصبح العرض لهوية أخرى، فتطبيقه قد يكشف بيانات أو يمحو عرض الجديد. تتبع جيل الهوية أو دورة عميل مكافئة وارفض النتائج غير المتوافقة مع مسح السجلات عند التبديل.
أهم ما تعلمته
- تحديث الكيان والعضوية والحداثة قرارات منفصلة.
- تتبع هوية المخبأ وعمره الجمهور المصادق عليه.