كيفية بناء واجهات برمجة التطبيقات السريعة السريعة باستخدام Node.js و MongoDB و Fastify و Swagger

برنامج تعليمي خطوة بخطوة

صورة الائتمان: صممه Dooder

من المفترض ، لا يوجد مطور ويب غريب على واجهات برمجة تطبيقات REST والتحديات التي يجلبها تصميم حل API الفعال والكفء.

تشمل هذه التحديات:

  • سرعة. (أوقات استجابة API.)
  • توثيق. (امسح المستندات الموجزة ، واصف واجهة برمجة التطبيقات.)
  • العمارة والاستدامة. (قاعدة بيانات قابلة للصيانة وقابلة للتوسيع.)

في هذا البرنامج التعليمي ، سنقوم بمعالجة كل ما سبق باستخدام مزيج من Node.js و MongoDB و Fastify و Swagger.

الكود المصدري للمشروع متاح على جيثب.

قبل أن نبدأ

يجب أن يكون لديك معرفة جافا سكريبت للمبتدئين إلى المتوسط ​​، وسمعت عن Node.js و MongoDB ، ومعرفة ما هي واجهات برمجة تطبيقات REST.

فيما يلي بعض الروابط لإطلاعك على آخر التطورات:

  • جافا سكريبت
  • نود.جي إس
  • MongoDB
  • واجهات برمجة التطبيقات REST

التكنولوجيا التي سوف نستخدمها

  • Fastify
  • النمس
  • اختيال

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

سوف تحتاج إلى تثبيت ما يلي

  • نود.جي إس / الآلية الوقائية الوطنية
  • MongoDB
  • ساعي البريد

ستحتاج أيضًا إلى IDE ومحطة طرفية ، وأنا أستخدم iTerm2 لنظام التشغيل Mac و Hyper for Windows.

هيا بنا نبدأ

قم بتهيئة مشروع جديد عن طريق فتح الجهاز الطرفي وتنفيذ سطور التعليمات البرمجية التالية:

mkdir fastify-api
مؤتمر نزع السلاح fastify api
mkdir src
مؤتمر نزع السلاح src
touch index.js
npm init

في التعليمة البرمجية أعلاه ، أنشأنا دليلين جديدين ، تم التنقل فيهما ، وقمنا بإنشاء ملف index.js ، وقمنا بتهيئة مشروعنا عبر npm.

سيُطلب منك إدخال عدة قيم عند تهيئة مشروع جديد ، يمكنك تركه فارغًا وتحديثه في مرحلة لاحقة.

بمجرد الانتهاء ، يتم إنشاء ملف package.json في دليل src. في هذا الملف ، يمكنك تغيير القيم التي تم إدخالها عند تهيئة المشروع.

بعد ذلك ، نقوم بتثبيت جميع التبعيات التي سنحتاجها:

npm i nodemon mongoose fastify fast-swagger boom

فيما يلي وصف موجز لما تفعله كل حزمة ، مقتبس من مواقعها الإلكترونية:

nodemon

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

لإعداد nodemon ، نحتاج إلى إضافة سطر التعليمات البرمجية التالي إلى ملف package.json الخاص بنا ، في كائن البرامج النصية:

"start": "./node_modules/nodemon/bin/nodemon.js ./src/index.js" ،

يجب أن يبدو ملف package.json الخاص بنا الآن كما يلي:

النمس

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

Fastify

Fastify هو إطار ويب يركز بشكل كبير على توفير أفضل تجربة مطور مع بنية حمولة أقل وأقل مكونات قوية. إنها مستوحاة من Hapi و Express ، وحسب علمنا ، فهي واحدة من أسرع أطر الويب في المدينة.

fastify-اختيال

مولد وثائق Swagger ل Fastify. يستخدم المخططات التي تعلنها في طرقك لإنشاء مستند متوافق مع اختيال.

فقاعة

يوفر boom مجموعة من الأدوات المساعدة لإرجاع أخطاء HTTP.

إعداد الخادم وإنشاء المسار الأول

أضف الكود التالي إلى ملف index.js:

نطلب إطار عمل Fastify ، ونعلن طريقنا الأول ، ونهيئ الخادم على المنفذ 3000 ، الشفرة واضحة تمامًا ولكنها تدل على كائن الخيارات الذي تم تمريره عند تهيئة Fastify:

// يتطلب إطار التثبيت وتثبيته
const fastify = require ('fastify') ({
  مسجل: صحيح
})

يمكّن الرمز أعلاه مسجل Fastify المدمج ، والذي يتم تعطيله افتراضيًا.

يمكنك الآن تشغيل الكود التالي في دليل src في جهازك:

npm البداية

الآن ، عندما تنتقل إلى http: // localhost: 3000 / سترى الكائن {hello: world} يتم إرجاعه.

سنعود إلى ملف index.js ، ولكن الآن ، دعنا ننتقل إلى إعداد قاعدة البيانات الخاصة بنا.

بدء MongoDB وإنشاء النموذج

بمجرد تثبيت MongoDB بنجاح ، يمكنك فتح نافذة طرفية جديدة وبدء تشغيل مثيل MongoDB عن طريق تشغيل ما يلي:

mongod

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

أضف التالي إلى ملف index.js:

...
// تتطلب وحدات خارجية
const mongoose = require ('mongoose')
// الاتصال DB
mongoose.connect ( 'mongodb: // المضيف المحلي / mycargarage')
 .then (() => console.log ('MongoDB متصل ...'))
 .catch (err => console.log (err))
...

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

لاحظ أنه لم يكن عليك إعادة تشغيل التطبيق ، وذلك بفضل حزمة Nodemon التي أضفناها سابقًا.

الآن بعد أن أصبحت قاعدة البيانات الخاصة بنا قيد التشغيل ، يمكننا إنشاء نموذجنا الأول. قم بإنشاء مجلد جديد داخل دليل src ، يُسمى الموديلات ، وداخله أنشئ ملفًا جديدًا يسمى Car.js وأضف الكود التالي:

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

نستخدم أيضًا خريطة جديدة نسبيًا على Mongoose ويمكنك قراءة المزيد عنها هنا. نحن ثم تصدير carSchema لدينا لاستخدامها في التطبيق لدينا.

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

إنشاء وحدة تحكم السيارة

للبدء في إنشاء وحدات التحكم ، نقوم بإنشاء مجلد في دليل src يسمى وحدات التحكم ، وضمن المجلد ، نقوم بإنشاء ملف carController.js:

قد يبدو ما ورد أعلاه قليلًا ، لكنه بسيط بالفعل.

  • نحتاج إلى طفرة للتعامل مع أخطائنا: boom.boomify (err).
  • نحن تصدير كل من وظائفنا التي سوف نستخدمها في طريقنا.
  • كل وظيفة عبارة عن وظيفة غير متزامنة يمكن أن تحتوي على تعبير قيد الانتظار يتوقف مؤقتًا عن تنفيذ وظيفة المتزامن وينتظر حل الوعد الذي تم تمريره ، ثم يستأنف تنفيذ وظيفة المتزامن ويعيد القيمة التي تم حلها. تعلم المزيد هنا.
  • يتم لف كل وظيفة في بيان try / catch. تعلم المزيد هنا.
  • تأخذ كل وظيفة معلمتين: req (الطلب) والرد (الرد). في برنامجنا التعليمي ، نستخدم فقط معلمة الطلب. سنستخدمه للوصول إلى نص الطلب ومعلمات الطلب ، مما يسمح لنا بمعالجة البيانات. تعلم المزيد هنا.
  • يحيط علما بالكود على السطر 31:
    سيارة const = سيارة جديدة ({… req.body})
    هذا يجعل استخدام مشغل انتشار جافا سكريبت. تعلم المزيد هنا.
  • يحيط علما بالكود على السطر 42:
    const {... updateData} = سيارة
    هذا يجعل من استخدام جافا سكريبت التدمير ، جنبا إلى جنب مع عامل الانتشار. تعلم المزيد هنا.

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

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

إنشاء واستيراد الطرق

مرة أخرى ، يمكننا أن نبدأ بإنشاء مجلد في الدليل الجذر لمشروعنا ، ولكن هذه المرة ، يطلق عليه طرق. داخل المجلد ، نقوم بإنشاء ملف index.js بالشفرة التالية:

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

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

المُعرِّف التالي لبعض الطرق هو وسيلة شائعة لتمرير المعلمات إلى المسارات ، وهذا سيسمح لنا بالوصول إلى المعرف كما يلي:

http://127.0.0.1:3000/api/cars/5bfe30b46fe410e1cfff2323

ضعها جميعًا معًا واختبار واجهة برمجة التطبيقات

الآن وبعد أن تم إنشاء معظم أجزائنا ، نحتاج فقط إلى توصيلها جميعًا معًا لبدء تقديم البيانات عبر API الخاصة بنا.

أولاً ، نحتاج إلى استيراد المسارات التي أنشأناها بإضافة سطر التعليمات البرمجية التالي إلى ملف index.js الرئيسي:

طرق const = تتطلب (". / طرق")

نحتاج بعد ذلك إلى حلقة فوق مجموعة مساراتنا لتهيئتها باستخدام Fastify. يمكننا القيام بذلك بالشفرة التالية ، والتي يجب أيضًا إضافتها إلى ملف index.js الرئيسي:

ways.forEach ((route، index) => {
 fastify.route (الطريق)
})

الآن نحن مستعدون لبدء الاختبار!

أفضل أداة لهذا المنصب هي Postman ، والتي سنستخدمها لاختبار جميع طرقنا. سنرسل بياناتنا ككائنات خام في نص الطلب وكمعلمات.

العثور على جميع السيارات:

العثور على سيارة واحدة:

إضافة سيارة جديدة **:

** يبدو أن الخدمات فارغة ، ولكن المعلومات ، في الواقع ، لا تزال قائمة في قاعدة البيانات.

تحديث سيارة:

حذف سيارة:

لدينا الآن واجهة برمجة تطبيقات تعمل بكامل طاقتها - ولكن ماذا عن الوثائق؟ هذا هو المكان الذي يكون فيه Swagger مفيدًا جدًا.

مضيفا اختيال وتختتم

الآن ، سنقوم بإنشاء مجلدنا النهائي المسمى config. في الداخل ، سننشئ ملفًا يسمى swagger.js بالشفرة التالية:

الرمز أعلاه هو كائن يحتوي على الخيارات التي سنمررها إلى البرنامج المساعد fastify-swagger. للقيام بذلك ، نحتاج إلى إضافة ما يلي إلى ملف index.js:

// استيراد خيارات اختيال
const swagger = requ (/ ./ config / swagger ')
// سجل اختيال
fastify.register (تتطلب ('fastify-swagger') ، swagger.options)

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

...
ننتظر fastify.listen (3000)
fastify.swagger ()
fastify.log.info (`الاستماع على $ {fastify.server.address (). port}`)
...

وهذا هو عليه! إذا انتقلت الآن إلى http: // localhost: 3000 / documentation ، فسترى ما يلي:

بهذه السهولة! لديك الآن وثائق API ذاتية التحديث والتي ستتطور مع واجهة برمجة التطبيقات. يمكنك بسهولة إضافة معلومات إضافية إلى طرقك ، انظر المزيد هنا.

ماذا بعد

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

في البرنامج التعليمي التالي ، سنقوم بدمج GraphQL ودمج النهاية الأمامية مع Vue.js أيضًا!