pg) أكثر مشغّلات Postgres استخدامًا في Node.js. في هذا الدليل، ستتصل بخدمة ClickHouse Managed Postgres عبر pg.Pool مع تحقق كامل من شهادة TLS، ثم تُنشئ جدولين، وتُحوّل الأموال بين الحسابات ضمن معاملة واحدة، وأخيرًا تعرض البيانات عبر خادم node:http صغير.
المتطلبات الأساسية
- Node.js الإصدار 20.6 أو أحدث (للاستفادة من العلامة المدمجة
--env-file). اختُبر هذا الدليل باستخدام Node.js 24.21.0 وpg8.23.1. - حساب على ClickHouse Cloud
psql، لإنشاء قاعدة البيانات
إنشاء خدمة ClickHouse Managed Postgres
في وحدة تحكم ClickHouse Cloud، انقر على New service ثم اختر Postgres. سيصبح المثيل جاهزًا في غضون دقائق معدودة. للاطلاع على شرح تفصيلي للخطوات، راجع دليل البدء السريع.الحصول على بيانات الاتصال
انقر على Connect في الشريط الجانبي الأيسر لخدمتك. بعد تحديد Directly، انسخ URL الاتصال من علامة التبويب url. اترك Use SSL معطّلاً، إذ يمرّر التطبيق شهادة CA ضمن الشيفرة بدلاً من تضمينها في URL (راجع تهيئة مجمّع الاتصالات). يتصل هذا الدليل مباشرةً بـ Postgres على المنفذ5432. فخادم Node.js الذي يعمل لفترات طويلة يحتفظ أصلاً بمجمّع اتصالات خاص به عبر pg.Pool، لذا لا حاجة إلى أداة تجميع اتصالات ثانية أمام Postgres. أما إذا كنت تشغّل عمليات كثيرة أو دوالاً بلا خادم، فاستخدم PgBouncer المضمّن بدلاً من ذلك؛ راجع استخدام PgBouncer.
بعد ذلك، نزّل شهادة CA الخاصة بمثيلك. فعّل Use SSL وانقر على Download CA certificate، أو انتقل إلى Settings → CA Certificate → Download CA certificate. هذه الشهادة خاصة بمثيلك وحده.
إعداد المشروع
أنشئ مشروعًا وثبّتpg:
.mjs، ولذلك تعمل سواء كان ملف package.json في مشروعك يستخدم CommonJS أو وحدات ES.
إنشاء قاعدة البيانات
انقل ملف<service-name>-ca-certificate.pem الذي نزّلته إلى دليل المشروع، وأعِد تسميته إلى ca-certificate.pem، ثم أنشئ قاعدة بيانات للتطبيق:
.env يتضمن URL الاتصال الذي نسخته بعد تغيير اسم قاعدة البيانات فيه إلى guide_nodejs، إضافةً إلى مسار الشهادة:
.env
@ أو / أو #، فاستخدم ترميز النسبة المئوية (percent-encoding) لترميزها في عنوان URL.
تهيئة مجمّع الاتصالات
أنشئ الملفdb.mjs. يُصدِّر هذا الملف مجمّع اتصالات واحدًا تتشاركه بقية أجزاء التطبيق:
db.mjs
ssl: { ca } ما يعادل sslmode=verify-full: إذ تتحقق pg من أن شهادة الخادم موقَّعة من CA الخاص بالمثيل لديك، ومن أنها تطابق اسم المضيف. القيمة الافتراضية لـ rejectUnauthorized هي true؛ فلا تضبطها على false.
إنشاء المخطط
أنشئ الملفsetup.mjs. يتولى هذا الملف إنشاء الجداول، وإدراج حسابين باستخدام استعلامات ذات معلمات، ثم قراءتهما للتحقق منهما:
setup.mjs
$1، $2، …) بدلًا من دمجها في string الخاص باستعلام SQL. إذ يرسلها pg منفصلةً عن نص الاستعلام، ما يحول دون هجمات حقن SQL. كما تُحوَّل مصفوفات JavaScript إلى مصفوفات Postgres، كما هو الحال في الاستعلام ANY($1).
شغِّله:
pg قيم numeric (وbigint) على هيئة سلاسل نصية (strings) تجنّبًا لفقدان الدقة. لذا، حوّلها صراحةً إذا كنت تحتاج إليها كأرقام.
تنفيذ الاستعلامات ضمن معاملة
يجب أن تُنفَّذ المعاملة على اتصال واحد، لذا احجز عميلًا من مجمّع الاتصالات باستخدامpool.connect، واحرص دائمًا على تحريره بعد الانتهاء. أنشئ الملف transfer.mjs:
transfer.mjs
pool.query لتنفيذ العبارات داخل المعاملة، إذ قد يُنفَّذ كل استدعاء لـ pool.query على اتصال مختلف.
تقديم البيانات عبر HTTP
أنشئ الملفserver.mjs. يقدّم هذا الملف الحسابات وعمليات التحويل بتنسيق JSON على المنفذ 3107، ويستقبل عمليات تحويل جديدة، ويتوقف بشكل سليم عند تلقّي الإشارة SIGINT (Ctrl+C) أو SIGTERM:
server.mjs
pool.end مرة واحدة فقط عند إيقاف العملية، لا بعد كل طلب؛ إذ ينتظر حتى تُعاد جميع العملاء المستعارة إلى مجمّع الاتصالات، ثم يغلق كل الاتصالات.
التحقق
شغّل الخادم:alice بالفعل عند فشلها، غير أن ROLLBACK ألغى هذا الخصم. افتح http://localhost:3107/accounts في متصفحك لعرض الأرصدة. ستبدو الاستجابة على النحو التالي:
pg_stat_ssl:
DATABASE_CA_CERT إلى أي شهادة أخرى، يفشل الاتصال ويظهر الخطأ unable to verify the first certificate، ما يؤكد أن شهادة الخادم يجري التحقق منها فعلاً.
أخيراً، أوقف الخادم بالضغط على Ctrl+C. ستظهر الرسالة SIGINT received, shutting down تليها Pool closed.
يمكنك أيضاً استعراض البيانات في وحدة التحكم. افتح SQL console، ثم وسّع قاعدة البيانات guide_nodejs، وافتح الجدول accounts:
استخدام PgBouncer
للاتصال عبر PgBouncer المضمَّن، اختر via PgBouncer في نافذة Connect واستخدم المنفذ6432 في DATABASE_URL. لا حاجة إلى أي تغييرات في الشيفرة، فشهادة CA نفسها تعمل كما هي.
يعمل PgBouncer في وضع تجميع المعاملات (transaction pooling)، ما يعني أن كل معاملة قد تُنفَّذ على اتصال Postgres مختلف. عند استخدام pg:
- تعمل الاستعلامات ذات المعلمات، والعبارات المُعدّة المسمّاة (
pool.query({ name, text, values }))، والمعاملات التي تستخدمpool.connectكما هو موضّح في هذا الدليل. - لا تنتقل عبارتا
PREPAREوEXECUTEعلى مستوى SQL، ولا إعدادات الجلسة المضبوطة باستخدامSET، من معاملة إلى أخرى. استخدمSET LOCALداخل المعاملة بدلاً من ذلك. - يعرض
pg_stat_sslمعلومات الاتصال بين PgBouncer وPostgres، ولذلك يُرجع استعلام التحقق من TLS الوارد أعلاه القيمةssl: false. ومع ذلك، يظل اتصال تطبيقك بـ PgBouncer خاضعاً للتحقق، إذ يفشل الاتصال بالطريقة نفسها عند استخدام شهادة CA خاطئة.
الخطوات التالية
- الاتصال: سلاسل الاتصال وPgBouncer وTLS
- الإعدادات: تغيير المعلمات مثل
max_connections - النسخ المتماثلة للقراءة: توجيه استعلامات القراءة فقط إلى نسخة متماثلة
- التوافر العالي: النسخ الاحتياطية الجاهزة (Standbys) والتحويل التلقائي عند الفشل (Failover)