13 ديسمبر 2025·6 دقيقة قراءة

تمديد الباك‌اند المصدَّر بلغة Go بميدلوير مخصص وآمن

تمديد باك‌اندات Go المصدرة دون فقدان التعديلات: أين تضع الشيفرة المخصصة، كيفية إضافة ميدلوير ونقاط نهاية، وكيف تخطط للترقيات.

تمديد الباك‌اند المصدَّر بلغة Go بميدلوير مخصص وآمن

ما الذي يحدث عندما تخصص الشيفرة المصدرة بشكل خاطئ

الشيفرة المصدرة ليست نفس مستودع Go المكتوب يدوياً. مع منصات مثل AppMaster، يتم توليد الباك‌اند من نموذج مرئي (مخطط البيانات، عمليات العمل، إعداد API). عند إعادة التصدير، قد يعيد المولد كتابة أجزاء كبيرة من الشيفرة لمطابقة النموذج المحدث. هذا رائع للحفاظ على النظافة، لكنه يغير طريقة التخصيص.

الخطأ الأكثر شيوعاً هو تعديل الملفات المولدة مباشرة. قد ينجح مرة واحدة، ثم يعيد التصدير التالي الكتابة فوق تغييراتك أو يُنتج تعارضات دمج قبيحة. والأسوأ أن تعديلات يدوية صغيرة قد تكسر افتراضات المولد بهدوء (ترتيب الراوتز، سلاسل الميدلوير، التحقق من الطلب). التطبيق قد يزال يُبنى، لكن السلوك يتغير.

التخصيص الآمن يعني أن تغييراتك قابلة للتكرار وسهلة المراجعة. إذا استطعت إعادة التصدير، تطبيق طبقتك المخصصة، ورؤية ما تغير بوضوح، فأنت في مكان جيد. إذا كان كل ترقية تشعر بأنها آثار أثرية، فأنت لست كذلك.

فيما يلي المشاكل الشائعة التي تراها عادةً عند حدوث التخصيص في المكان الخطأ:

  • تختفي تعديلاتك بعد إعادة التصدير، أو تقضي ساعات في حل التعارضات.
  • تتغير الراوتز ولا يعمل الميدلوير حيث تتوقعه.
  • يتكرر المنطق بين النموذج بدون كود وشيفرة Go، ثم يبتعدان عن بعضهما.
  • يتحول "تغيير سطر واحد" إلى فورك لا يرغب أحد في لمسه.

قاعدة بسيطة تساعدك في تقرير مكان وضع التغييرات. إذا كان التغيير جزءاً من سلوك تجاري يجب أن يستطيع غير المطورين تعديله (الحقول، التحقق، سير العمل، الأذونات)، ضعه في النموذج بدون كود. إذا كان سلوك بنية تحتية (تكامل مصادقة مخصص، تسجيل الطلبات، رؤوس خاصة، حدود معدل)، ضعه في طبقة Go مخصصة تبقى بعد إعادة التصدير.

مثال: تسجيل التدقيق لكل طلب عادة ما يكون ميدلوير (شيفرة مخصصة). حقل جديد مطلوب على طلب عادة ما يكون في نموذج البيانات (بدون كود). حافظ على هذا التقسيم واضحاً وستبقى الترقيات متوقعة.

خرائط المستودع: الأجزاء المولدة مقابل أجزائك

قبل أن توسع باك‌اند مصدَّر، اقضِ 20 دقيقة في رسم ما سيعاد توليده عند إعادة التصدير وما تملكه حقاً. تلك الخريطة هي ما يحافظ على ترقية مملة.

عادةً ما تكشف الشيفرة المولدة عن نفسها: تعليقات رأسية مثل "Code generated" أو "DO NOT EDIT"، أنماط تسمية متكررة، وبنية موحدة جداً مع قليل من التعليقات اليدوية.

طريقة عملية لتصنيف المستودع هي ترتيب كل شيء إلى ثلاث سلات:

  • مولد (قراءة فقط): ملفات بعلامات المولد الواضحة، أنماط متكررة، أو مجلدات تبدو كهيكل إطار عمل.
  • مملوك من قبلك: الحزم التي أنشأتها، الأغلفة (wrappers)، والتهيئات التي تتحكم بها.
  • فواصل مشتركة: نقاط توصيل مخصصة للتسجيل (routes, middleware, hooks)، حيث قد تكون التعديلات الصغيرة ضرورية لكن يجب أن تبقى قليلة.

عامل السلة الأولى كقراءة فقط حتى لو كان بإمكانك تقنياً تعديلها. إذا غيرتها، افترض أن المولد سيعيد كتابتها لاحقاً أو ستصبح لديك عبء دمج للأبد.

اجعل الحد الفاصل واضحاً للفريق بكتابة ملاحظة قصيرة ووضعها في المستودع (مثلاً README في الجذر). اجعلها بسيطة:

"Generator-owned files: anything with a DO NOT EDIT header and folders X/Y. Our code lives under internal/custom (or similar). Only touch wiring points A/B, and keep changes there small. Any wiring edit needs a comment explaining why it can't live in our own package."

تلك الملاحظة الواحدة تمنع الإصلاحات السريعة من التحول إلى ألم دائم أثناء الترقية.

أين تضع الشيفرة المخصصة حتى تبقى الترقيات بسيطة

القاعدة الأأمن بسيطة: اعتبر الشيفرة المصدرة للقراءة فقط، وضع تغييراتك في منطقة مخصصة مملوكة بوضوح. عند إعادة التصدير لاحقاً (مثلاً من AppMaster)، تريد أن يكون الدمج في الغالب "استبدال الشيفرة المولدة، الحفاظ على الشيفرة المخصصة".

أنشئ حزمة منفصلة لإضافاتك. يمكن أن تعيش داخل المستودع، لكنها لا ينبغي أن تختلط مع الحزم المولدة. الشيفرة المولدة تشغل نواة التطبيق؛ حزمك تضيف ميدلوير، راوتز، ومساعدات.

تخطيط عملي:

  • internal/custom/ للميدلوير، المعالجات، والمساعدات الصغيرة
  • internal/custom/routes.go لتسجيل الراوتز المخصصة في مكان واحد
  • internal/custom/middleware/ لمنطق الطلب/الاستجابة
  • internal/custom/README.md مع بضع قواعد للتعديلات المستقبلية

تجنب تعديل توصيل الخادم في خمس أماكن مختلفة. استهدف نقطة رقيقة واحدة "للتثبيت" حيث ترفق الميدلوير وتسجيل الراوتز الإضافية. إذا كشفت الشيفرة المولدة عن راوتر أو سلسلة معالجات، اربط هناك. إذا لم تفعل، أضف ملف تكامل واحد قرب نقطة الدخول يستدعي شيئاً مثل custom.Register(router).

اكتب الشيفرة المخصصة كما لو أنك قد تضعها في تصدير جديد غداً. حافظ على التبعيات طفيفة، تجنب نسخ الأنواع المولدة عندما تستطيع، واستخدم محولات صغيرة بدلاً من ذلك.

خطوة بخطوة: إضافة ميدلوير مخصص بأمان

الهدف هو وضع المنطق في حزمة خاصة بك، ولمس الشيفرة المولدة في مكان واحد فقط للتوصيل.

أولاً، اجعل الميدلوير ضيق النطاق: تسجيل الطلب، فحص مصادقة بسيط، حدود سرعة، أو معرف الطلب. إذا حاول أن يقوم بثلاثة مهام ستضطر لتغيير مزيد من الملفات لاحقاً.

أنشئ حزمة صغيرة (مثلاً internal/custom/middleware) لا تحتاج أن تعرف تطبيقك بأكمله. حافظ على السطح العام صغيراً: دالة منشئ واحدة تُعيد غلاف معالج Go قياسي.

package middleware

import "net/http"

func RequestID(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		// Add header, log, or attach to context here.
		next.ServeHTTP(w, r)
	})
}

الآن اختر نقطة تكامل واحدة: المكان الذي يُنشأ فيه الراوتر أو خادم HTTP. سجّل الميدلوير هناك مرة واحدة وتجنب توزيع التعديلات عبر الراوتز الفردية.

حافظ على حلقة التحقق قصيرة:

  • أضف اختباراً واحداً مركزاً باستخدام httptest يتحقق من نتيجة واحدة (كود الحالة أو رأس).
  • قم بطلب يدوي واحد وتأكد من السلوك.
  • تأكد من أن الميدلوير يتعامل بحكمة مع الأخطاء.
  • أضف تعليقاً قصيراً قرب سطر التسجيل يشرح لماذا موجود.

فرق صغير، نقطة توصيل واحدة، سهولة إعادة التصدير.

خطوة بخطوة: إضافة نقطة نهاية جديدة دون تشعب الكود

Stop forking generated code
Save time by generating the core app, then only hand-code the integrations you need.
Build With No Code

عامل الشيفرة المولدة كقراءة فقط وأضف نقطة النهاية في حزمة مخصصة صغيرة يستوردها التطبيق. هذا ما يبقي الترقيات معقولة.

ابدأ بكتابة العقد قبل لمس الشيفرة. ماذا تقبل نقطة النهاية (بارامترات استعلام، جسم JSON، رؤوس)؟ ما الذي تُعيده (شكل JSON)؟ اختر رموز الحالة مقدماً حتى لا ينتهي بك الأمر بسلوك "ما الذي عمل".

أنشئ معالجاً في حزمة مخصصة. اجعله رتيباً: اقرأ المدخلات، تحقق، استدعِ الخدمات أو مساعدات قاعدة البيانات الموجودة، اكتب استجابة.

سجّل الراوت عند نفس نقطة التكامل التي تستخدمها للميدلوير، لا داخل ملفات المعالجات المولدة. ابحث عن مكان تجميع الراوتر أثناء بدء التشغيل وربط راوتزك المخصصة هناك. إذا كان المشروع المولد يدعم خطاطيف أو تسجيل مخصص للمستخدم، فاستخدمها.

قائمة تحقق قصيرة تحافظ على السلوك متسقاً:

  • تحقق من المدخلات مبكراً (الحقول المطلوبة، الصيغ، الحد الأدنى/الأقصى).
  • أعد شكلاً واحداً للأخطاء في كل مكان (message, code, details).
  • استخدم مهلات السياق حيث يمكن للعمل أن يتوقف (DB، استدعاءات الشبكة).
  • سجّل الأخطاء غير المتوقعة مرة واحدة، ثم أعد 500 نظيف.
  • أضف اختباراً صغيراً يضرب الراوت الجديد ويتحقق من الحالة و JSON.

وتأكد أيضاً أن الراوتر يسجل نقطتك النهائية مرة واحدة بالضبط. التسجيل المكرر فخ شائع بعد الدمج.

أنماط التكامل التي تبقي التغييرات محصورة

Export code without surprises
Model data and workflows visually, then export a Go backend you can extend safely.
Try AppMaster

عامل الباك‌اند المولد كاعتماد. فضّل التكوين والتركيب: اربط الميزات حول التطبيق المولد بدلاً من تعديل منطق النواة.

فضّل التكوين والتركيب

قبل كتابة الشيفرة، تحقق مما إذا كان السلوك يمكن إضافته عبر التكوين، الخطاطيف، أو التركيب القياسي. الميدلوير مثال جيد: أضفه عند الحافة (راوتر/ستاك HTTP) حتى يمكن إزالته أو إعادة ترتيبه دون لمس منطق العمل.

إذا احتجت سلوكاً جديداً (حدود معدل، تسجيل تدقيق، معرفات الطلب)، احتفظ به في حزمة خاصة وسجله من ملف تكامل واحد. في المراجعة يجب أن يكون من السهل شرح: "حزمة جديدة واحدة، نقطة تسجيل واحدة".

استخدم محولات لتجنب تسرب الأنواع المولدة

غالباً ما تتغير النماذج والـ DTOs المولدة عبر التصديرات. لتقليل ألم الترقية، ترجم على الحدود:

  • حوّل أنواع الطلب المولدة إلى هياكل داخلية خاصة بك.
  • نفّذ المنطق على هياكلك الداخلية فقط.
  • حوّل النتائج مرة أخرى إلى أنواع الاستجابة المولدة.

بهذه الطريقة، إذا تحركت الأنواع المولدة، يشير المترجم إلى مكان واحد لتعديله.

عندما تضطر حقاً للمس الشيفرة المولدة، عزلها في ملف توصيل واحد. تجنب التعديلات عبر معالجات مولدة متعددة.

// internal/integrations/http.go
func RegisterCustom(r *mux.Router) {
    r.Use(RequestIDMiddleware)
    r.Use(AuditLogMiddleware)
}

قاعدة عملية: إذا لم تستطع وصف التغيير في 2–3 جمل، فربما هو متشابك جداً.

كيف تحافظ على اختلافات قابلة للإدارة مع الوقت

الهدف هو أن لا تتحول إعادة التصدير إلى أسبوع من التعارضات. اجعل التعديلات صغيرة، سهلة الاكتشاف، وسهلة الشرح.

استخدم Git من اليوم الأول وحافظ على تحديثات المولد منفصلة عن عملك المخصص. إذا خلطتهما، لن تعرف ما سبب عطل لاحقاً.

روتين الالتزام العملي:

  • غرض واحد لكل التزام ("إضافة ميدلوير معرف الطلب"، وليس "تصحيحات متنوعة").
  • لا تخلط تغييرات التنسيق فقط مع تغييرات المنطق.
  • بعد كل إعادة تصدير، التزم تحديث المولد أولاً، ثم التزامات التعديل المخصص.
  • استخدم رسائل التزام تذكر الحزمة أو الملف الذي لمسته.

احفظ CHANGELOG_CUSTOM.md بسيط يسرد كل تخصيص، لماذا موجود، وأين يعيش. هذا مفيد خصوصاً مع تصديرات AppMaster لأن المنصة قد تُعيد توليد الشيفرة بالكامل وتريد خريطة سريعة لما يجب إعادة تطبيقه أو التحقق منه.

قلل ضوضاء الفرق باستخدام قواعد تنسيق ثابتة وفحوصات lint. شغل gofmt على كل التزام وشغل نفس الفحوصات في CI. إذا كانت الشيفرة المولدة تستخدم أسلوباً معيناً، لا تقم "بتنظيفها" يدوياً إلا إذا كنت مستعداً لتكرار ذلك بعد كل إعادة تصدير.

إذا كان فريقك يكرر نفس التعديلات يدوياً بعد كل تصدير، فكر في سير عمل تصحيحي: صدر، طبق التصحيحات (أو سكربت)، شغّل الاختبارات، انشر.

خطط للترقيات: أعد التصدير، ادمج، وتحقق

Move from export to production
Deploy to AppMaster Cloud or your own cloud after you export and validate changes.
Deploy App

الترقيات أسهل عندما تعامل الباك‌اند كشيء يمكنك إعادة توليده، وليس كشيء تحافظ عليه يدوياً إلى الأبد. الهدف ثابت: أعد التصدير شيفرة نظيفة، ثم أعد تطبيق سلوكك المخصص عبر نفس نقاط التكامل كل مرة.

اختر إيقاع الترقية الذي يناسب تحمّلك للمخاطر ومدى تغيّر التطبيق:

  • مع كل إصدار منصة إذا احتجت إصلاحات أمنية أو ميزات سريعة
  • ربع سنوي إذا كان التطبيق مستقرًا والتغييرات صغيرة
  • فقط عند الحاجة إذا كان الباك‌اند نادراً ما يتغير والفريق صغير

عندما يحين وقت الترقية، قم بتصدير تجريبي في فرع منفصل. ابنِّ وشغّل النسخة المصدرة حديثاً وحدها أولاً، حتى تعرف ما تغير قبل أن تتدخل طبقتك المخصصة.

ثم أعد تطبيق التخصيصات عبر الفواصل المخطط لها (تسجيل الميدلوير، مجموعة راوتر مخصصة، حزمةك المخصصة). تجنب التعديلات الجراحية داخل الملفات المولدة. إذا لم يمكن التعبير عن تغيير عبر نقطة تكامل، فهذه إشارة لإضافة فاصل جديد مرة واحدة، ثم استخدمه للأبد.

تحقق بقائمة تحقق انحدارية قصيرة تركز على السلوك:

  • تدفق المصادقة يعمل (تسجيل دخول، تجديد توكن، تسجيل خروج)
  • 3 إلى 5 نقاط API رئيسية تعيد نفس أكواد الحالات والأشكال
  • مسار غير سعيد واحد لكل نقطة نهاية (مدخلات خاطئة، مصادقة مفقودة)
  • المهام الخلفية أو المجدولة لا تزال تعمل
  • نقطة الصحة/الجاهزية تعيد OK في إعداد النشر

إذا أضفت ميدلوير تسجيل تدقيق، تحقق من أن السجلات لا تزال تتضمن معرف المستخدم واسم الراوت لعملية كتابة واحدة بعد كل إعادة تصدير ودمج.

أخطاء شائعة تجعل الترقيات مؤلمة

أسرع طريقة لتدمير إعادة التصدير التالية هي تعديل الملفات المولدة "لمرة واحدة فقط". يبدو الأمر غير مؤذ عندما تصلح خطأ صغيراً أو تضيف فحص رأس، لكن بعد أشهر لن تتذكر ما تغير ولماذا، أو ما إذا كان المولد الآن ينتج نفس النتيجة.

فخ آخر هو نشر الشيفرة المخصصة في كل مكان: مساعد في حزمة، فحص مصادقة مخصص في أخرى، تعديل ميدلوير قرب التوجيه، ومعالج لمرة واحدة في مجلد عشوائي. لا أحد يملكه، وكل دمج يصبح رحلة بحث. احتفظ بالتغييرات في عدد قليل من الأماكن الواضحة.

الربط الوثيق بالداخلية المولدة

تصبح الترقيات مؤلمة عندما تعتمد شيفرتك المخصصة على هياكل داخلية مولدة، حقول خاصة، أو تفاصيل ترتيب الحزم. حتى إعادة ترتيب صغيرة في الشيفرة المولدة قد تكسر بناءك.

حدود أكثر أماناً:

  • استخدم DTOs طلب/استجابة تسيطر عليها لحواف تخصيصك.
  • تفاعل مع الطبقات المولدة عبر واجهات أو دوال مصدرة، ليس عبر أنواع داخلية.
  • اتخذ قرارات الميدلوير بناءً على بدائيات HTTP (الرؤوس، الطريقة، المسار) عندما يكون ذلك ممكناً.

تخطي الاختبارات حيث تحتاجها أكثر

أخطاء الميدلوير والتوجيه تضيع وقتاً لأن الفشل قد يبدو كـ 401 عشوائي أو "نقطة نهاية غير موجودة". بعض الاختبارات المركزة توفر ساعات من العمل.

مثال واقعي: تضيف ميدلوير تدقيق يقرأ جسم الطلب لتسجيله، وفجأة بعض النهايات تتلقى جسماً فارغاً. اختبار صغير يرسل POST عبر الراوتر ويتحقق من أثر التدقيق وسلوك المعالج يلتقط هذا التراجع ويمنح الثقة بعد إعادة التصدير.

قائمة مراجعة سريعة قبل الإصدار

Build internal tools faster
Build an internal tool or admin portal fast, then extend it with custom Go middleware.
Start Free

قبل شحن التغييرات المخصصة، قم بمرور سريع يحميك أثناء إعادة التصدير التالية. يجب أن تعرف بالضبط ما الذي ستعيد تطبيقه، أين يعيش، وكيف تتحقق منه.

  • احتفظ بكل الشيفرة المخصصة في حزمة أو مجلد مسمى بوضوح (مثلاً، internal/custom/).
  • حدِّ نقاط التماس مع توصيل المولد إلى ملف أو ملفين. عاملهم كجسور: سجل الراوتز مرة، وسجل الميدلوير مرة.
  • وثّق ترتيب الميدلوير وسبب ذلك ("المصادقة قبل حد المعدل" ولماذا).
  • تأكد من أن كل نقطة نهاية مخصصة لها اختبار واحد على الأقل يثبت أنها تعمل.
  • اكتب إجراء ترقية قابل للتكرار: إعادة تصدير، إعادة تطبيق الطبقة المخصصة، تشغيل الاختبارات، النشر.

إذا فعلت شيئاً واحداً فقط، فقم بملاحظة الترقية. إنها تحول "أعتقد أنه يعمل" إلى "نستطيع إثبات أنه لا يزال يعمل".

مثال: إضافة تسجيل تدقيق ونقطة صحّة

Separate generated vs custom code
Create business logic in no-code and keep custom Go changes in one owned layer.
Start Building

افترض أنك صدرت باك‌اند Go (مثلاً من AppMaster) وتريد إضافتين: معرف طلب بالإضافة إلى تسجيل تدقيق لإجراءات المسؤولين، ونقطة /health بسيطة للمراقبة. الهدف هو إبقاء تغييراتك سهلة إعادة التطبيق بعد إعادة التصدير.

لتسجيل التدقيق، ضع الشيفرة في مكان مملوك بوضوح مثل internal/custom/middleware/. أنشئ ميدلوير يقوم (1) بقراءة X-Request-Id أو توليد واحد، (2) تخزينه في سياق الطلب، و(3) تسجيل سطر تدقيق قصير لمسارات الإدارة (الطريقة، المسار، معرف المستخدم إن وُجد، والنتيجة). اجعلها سطرًا واحدًا لكل طلب وتجنب تفريغ حمولات كبيرة.

اربطها عند الحافة، قرب مكان تسجيل الراوتز. إذا كان الراوتر المولد له ملف إعداد واحد، أضف خطافاً صغيراً هناك يستورد ميدلويرك ويطبقه على مجموعة الإدارة فقط.

بالنسبة لـ /health، أضف معالجًا صغيرًا في internal/custom/handlers/health.go. أعد 200 OK مع جسم قصير مثل ok. لا تضف مصادقة إلا إذا كانت المراقبات بحاجة إليها. إذا فعلت، وثّق ذلك.

للحفاظ على التغيير سهل التطبيق، هيئ الالتزامات بهذا الشكل:

  • الالتزام 1: إضافة internal/custom/middleware/audit.go والاختبارات
  • الالتزام 2: توصيل الميدلوير في مسارات الإدارة (أصغر فرق ممكن)
  • الالتزام 3: إضافة internal/custom/handlers/health.go وتسجيل /health

بعد ترقية أو إعادة تصدير، تحقق من الأساسيات: تظل مسارات الإدارة تتطلب المصادقة، تظهر معرفات الطلب في سجلات الإدارة، /health يستجيب بسرعة، والميدلوير لا يضيف زمن استجابة ملحوظاً تحت حمل خفيف.

الخطوات التالية: ضع سير عمل تخصيص يمكنك الحفاظ عليه

عامل كل تصدير كعملية بناء جديدة يمكنك تكرارها. يجب أن تشعر شيفرتك المخصصة كطبقة إضافية، ليست إعادة كتابة.

قرر ما الذي ينتمي إلى الشيفرة مقابل النموذج بدون كود في المرة القادمة. قواعد العمل، أشكال البيانات، ومنطق CRUD القياسي عادةً ما تنتمي إلى النموذج. التكاملات الخاصة وهياكل الميدلوير الخاصة بالشركة عادةً ما تنتمي إلى الشيفرة المخصصة.

إذا كنت تستخدم AppMaster (appmaster.io)، صمّم عملك المخصص كطبقة امتداد نظيفة حول الباك‌اند المولد بلغة Go: احتفظ بالميدلوير، الراوتز، والمساعدات في مجموعة صغيرة من المجلدات يمكنك حملها عبر إعادة التصدير، واترك الملفات المملوكة للمولد دون لمس.

فحص عملي نهائي: إذا استطاع زميل إعادة التصدير، تطبيق خطواتك، والحصول على نفس النتيجة في أقل من ساعة، فنمط عملك قابل للصيانة.

الأسئلة الشائعة

Can I just edit the exported Go files directly?

لا تقم بتحرير الملفات التي يملكها المولد. ضع تغييراتك في حزمة مملوكة بوضوح (مثل internal/custom/) واربطها عبر نقطة تكامل صغيرة قرب بدء تشغيل الخادم. بهذه الطريقة سيستبدل التصدير إعادة التصدير الشيفرة المولدة بينما تبقى طبقتك المخصصة سليمة.

How do I tell which parts of the exported repo will be regenerated?

افترض أن أي ملف يحمل تعليقات مثل “Code generated” أو “DO NOT EDIT” سيُعاد إنشاؤه. راقب أيضاً البُنى المجلدية المتكررة، التسمية المتشابهة، وقلة التعليقات اليدوية؛ هذه علامات مميزة للمولد. القاعدة الأسرع هي اعتبار كل هذا للقراءة فقط حتى لو كان يُترجم عند التعديل.

What does a good “single integration point” look like?

احتفظ بملف «خطاف» واحد يستورد حزمة التخصيص ويسجل كل شيء: الميدلوير، الراوتز الإضافية، وأي توصيلات صغيرة. إذا وجدت نفسك تعدل خمسة ملفات توجيه أو معالجات مولدة متعددة، فأنت تقترب من فورك يصعب ترقيته.

How do I add custom middleware without breaking upgrades?

اكتب الميدلوير في حزمة خاصة بك واجعلها ضيقة: معرّفات الطلب، تسجيل التدقيق، حدود المعدل، أو رؤوس خاصة. ثم قم بتسجيلها مرة واحدة عند إنشاء الراوتر أو ستاك HTTP، وليس لكل راوت داخل المعالجات المولدة. فحص سريع باستخدام httptest للتحقق من رأس متوقع أو حالة عادة ما يكفي لاكتشاف انكسارات بعد إعادة التصدير.

How can I add a new endpoint without forking the generated backend?

حدد عقدة النهاية أولاً، ثم نفّذ المعالج في حزمة مخصصة وسجل الراوت عند نفس نقطة التكامل التي تستخدمها للميدلوير. اجعل المعالج بسيطاً: تحقق من المدخلات، استدعِ الخدمات القائمة، أعد شكلاً ثابتاً للأخطاء، وتجنب نسخ منطق المعالجات المولدة. هذا يبقي التغيير قابلاً للنقل إلى تصدير جديد.

Why do routes and middleware order change after a re-export?

قد تتغير طريقة تسجيل الراوتز أو تجميعها أو سلاسل الميدلوير عندما يغير المولد الترتيب. لحمايتك، اعتمد على نقطة تسجيل ثابتة ووثق ترتيب الميدلوير بجانب سطر التسجيل. إذا كان الترتيب مهماً (مثلاً، المصادقة قبل التدقيق)، فحدده عمداً وتحقق باستخدام اختبار صغير.

How do I avoid duplicating logic between the no-code model and custom Go code?

إذا طبقت نفس القاعدة في مكانين، فسوف ينحرفان مع الوقت وتواجه سلوكاً محيراً. ضع قواعد العمل التي يجب أن يعدلها غير المطورين (الحقول، التحقق، سير العمل، الصلاحيات) في النموذج بدون كود، واحتفظ بمخاوف البنية التحتية (التسجيل، تكامل المصادقة، حدود المعدل، الرؤوس) في طبقة Go المخصصة لديك. يجب أن يكون التقسيم واضحاً لمن يقرأ المستودع.

How do I stop my custom code from depending on generated internal types?

يمكن أن تتغير DTOs والهياكل الداخلية المولدة عبر التصديرات، لذا عزل هذا التغير على الحدود. حوّل المدخلات إلى هياكل داخلية تسيطر عليها، نفّذ المنطق عليها، ثم حوّل النتائج مرة أخرى عند الحافة. عندما تتغير الأنواع بعد إعادة التصدير، ستحدّث محولاً واحداً بدلاً من تتبع أخطاء ترجمة عبر طبقتك المخصصة بأكملها.

What’s the best Git workflow for re-exports and customizations?

افصل تحديثات المولد عن عملك المخصص في Git حتى تعرف ما الذي تغير ولماذا. سير عملي عملي هو: التزام تغييرات التصدير المولدة أولاً، ثم التزامات التوصيل والتعديلات المخصصة. إبقاء سجل صغير للتخصيص يوضح ما أضفت وأين يعيش يجعل الترقية التالية أسرع بكثير.

How should I plan upgrades so re-exports don’t turn into days of conflicts?

قم بإعادة تصدير تجريبية في فرع منفصل، بنِّها، وشغّل تمريراً قصيراً للتحقق قبل دمج طبقتك المخصصة مرة أخرى. بعد ذلك، أعد تطبيق التخصيصات عبر نفس الفواصل في كل مرة، ثم تحقق من عدد من نقاط النهاية الرئيسية بالإضافة إلى مسار غير سعيد واحد لكل نقطة نهاية. إذا لم يستطع شيء أن يُعبر عنه عبر فاصل، فأضف فاصلًا جديدًا مرة واحدة واستخدمه دائماً.

من السهل أن تبدأ
أنشئ شيئًا رائعًا

تجربة مع AppMaster مع خطة مجانية.
عندما تكون جاهزًا ، يمكنك اختيار الاشتراك المناسب.

البدء