إنشاء واجهة برمجة تطبيقات REST باستخدام Node.js وقاعدة بيانات Oracle. الجزء 3

الجزء 3. إنشاء API REST: معالجة طلبات GET


في المقالة السابقة ، قمت بتأسيس اتصال بقاعدة البيانات.

في نفس الوقت ، أضف منطق التوجيه ووحدة التحكم وقاعدة البيانات لمعالجة طلب HTTP GET إلى نقطة نهاية واجهة برمجة تطبيقات "الموظفين".

مضيفا منطق التوجيه


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

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

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

const express = require('express'); const router = new express.Router(); const employees = require('../controllers/employees.js'); router.route('/employees/:id?') .get(employees.get); module.exports = router; 

تبدأ وحدة التوجيه من خلال طلب الوحدة النمطية Express ، ثم تقوم بإنشاء مثيل جديد لفئة Router Express. يتم استخدام طريقة توجيه وحدة التوجيه لتحديد المسار بناءً على البيانات المرسلة. يتضمن المسار معلمة اختيارية (بسبب علامة استفهام) باسم معرف. يحتوي المسار الذي تم إرجاعه من جهاز التوجيه على أساليب تتوافق مع أساليب HTTP وتسمح بتعريف المعالجات. في هذه الحالة ، يتم استخدام أسلوب get لتعيين طلب GET الوارد إلى وظيفة get المحددة في وحدة تحكم الموظف (والتي سيتم إنشاؤها أدناه).

في الوقت الحالي لديك جهاز توجيه ، ولكن لا يتم استخدامه في التطبيق. لاستخدامه ، افتح ملف services / web-server.js وحذف السطر الموجود في الجزء العلوي ، والذي يتطلب وحدة نمطية لقاعدة البيانات (تم استخدامه للاختبار فقط في المنشور السابق ). أضف السطر التالي من التعليمات البرمجية في مكانه.

 // *** line that requires ../config/web-server.js is here *** const router = require('./router.js'); 

ثم استخدم الكود التالي لاستبدال معالج app.get بالكامل ، والذي يستجيب لطلبات GET باستخدام وحدة قاعدة البيانات (جميع الأسطر السبعة).

 // *** line that adds morgan to app here *** // Mount the router at /api so all its routes start with /api app.use('/api', router); 

الآن مطلوب جهاز التوجيه في وحدة خدمة الويب و "محمولة" في / api. هذا يعني أن عنوان URL الكامل لنقطة نهاية الموظف سيكون http: // server: port / api / employee /: id.

مضيفا منطق المراقب المالي


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

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

انتقل إلى دليل وحدات التحكم وإنشاء ملف جديد يسمى employee.js . انسخ والصق الكود التالي في الملف واحفظ التغييرات.

 /*01*/const employees = require('../db_apis/employees.js'); /*02*/ /*03*/async function get(req, res, next) { /*04*/ try { /*05*/ const context = {}; /*06*/ /*07*/ context.id = parseInt(req.params.id, 10); /*08*/ /*09*/ const rows = await employees.find(context); /*10*/ /*11*/ if (req.params.id) { /*12*/ if (rows.length === 1) { /*13*/ res.status(200).json(rows[0]); /*14*/ } else { /*15*/ res.status(404).end(); /*16*/ } /*17*/ } else { /*18*/ res.status(200).json(rows); /*19*/ } /*20*/ } catch (err) { /*21*/ next(err); /*22*/ } /*23*/} /*24*/ /*25*/module.exports.get = get; 

السطر 1: API قاعدة بيانات الموظف (سيتم إنشاؤه أدناه).
الأسطر 3-23: يتم الإعلان عن دالة غير متزامنة المسماة الحصول. يتم استخدام كتلة try-catch في نصوص الدالة للقبض على الاستثناءات التي تم إلقاؤها في السلسلة الرئيسية وتمريرها إلى الوظيفة التالية.
الأسطر من 5 إلى 7: يتم الإعلان عن ثابت ذي سياق مسمى - وهذا كائن عالمي سيحتوي على خصائص مرتبطة بطريقة البحث API لقاعدة البيانات. تتم إضافة خاصية المعرف إلى السياق استنادًا إلى القيمة التي تأتي من خلال req.params.id.
السطر 9: يتم استخدام طريقة البحث لاسترداد سجلات الموظفين المناسبة في قاعدة البيانات.
الأسطر 11-19: يتم استخدام المنطق الشرطي لتحديد رمز حالة HTTP الصحيح ونص الاستجابة. إذا تم طلب موظف واحد ولكن لم يتم العثور عليه ، يتم إرسال رمز الخطأ "404 غير موجود" كرد. خلاف ذلك ، يتم إرسال رمز 200 موافق مع هيئة الاستجابة المستندة إلى JSON.
السطر 25: تصدير الوحدة النمطية بحيث يمكنك إضافتها إلى الوحدات النمطية الأخرى

الكائن req.params هو مجرد واحد من العديد من الخصائص المستخدمة للحصول على البيانات من كائن طلب وارد . تتضمن الخصائص الشائعة الأخرى req.query لقيم سلسلة الاستعلام في عنوان URL و req.body لنص الطلب و req.cookies. يمكن الحصول على رؤوس HTTP باستخدام طريقة req.get.

مضيفا منطق قاعدة البيانات


لبدء تشغيل الوحدة النمطية لقاعدة بيانات الموظف ، انتقل إلى دليل db_apis وقم بإنشاء ملف جديد يسمى employee.js . أضف الكود التالي إلى الملف.

 const database = require('../services/database.js'); const baseQuery = `select employee_id "id", first_name "first_name", last_name "last_name", email "email", phone_number "phone_number", hire_date "hire_date", job_id "job_id", salary "salary", commission_pct "commission_pct", manager_id "manager_id", department_id "department_id" from employees`; async function find(context) { let query = baseQuery; const binds = {}; if (context.id) { binds.employee_id = context.id; query += `\nwhere employee_id = :employee_id`; } const result = await database.simpleExecute(query, binds); return result.rows; } module.exports.find = find; 

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

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

لاحظ أنه لم تتم إضافة قيمة context.id إلى الطلب مباشرةً. بدلاً من ذلك ، تم استخدام عنصر نائب باسم: employee_id - وهذا ما يسمى متغير ربط . يعد استخدام متغيرات ربط قاعدة بيانات Oracle مهمًا للغاية من حيث الأمان والأداء. يتم تعيين قيمة متغير الربط إلى كائن الربط ، والذي يتم تمريره مع الاستعلام إلى database.simpleExecute. أخيرًا ، يتم إرجاع الصفوف المستردة من قاعدة البيانات إلى المتصل.

قم بتشغيل التطبيق وانتقل إلى المتصفح على الموقع http: // localhost: 3000 / api / employee. يجب أن ترى قائمة من الموظفين على النحو التالي (لقد انهارت زوجين):
صورة
يمكنك تحديد موظف واحد عن طريق إضافة معرف إلى نهاية عنوان URL ، على سبيل المثال: http: // localhost: 3000 / api / employee / 100.

صورة

في هذه المرحلة ، يمكن لـ API التعامل مع طلبات GET في نقطة نهاية الموظفين. في المنشور التالي ، ستقوم بتوسيع وظيفة CRUD عن طريق إضافة منطق يعالج طلبات POST و PUT و DELETE.

Source: https://habr.com/ru/post/ar473350/


All Articles