Node.js और Oracle डेटाबेस के साथ REST API बनाना। भाग 3

भाग 3. एक रीस्ट एपीआई बनाना: जीईटी अनुरोधों को संभालना


पिछले लेख में, आपने डेटाबेस से संबंध स्थापित किया।

उसी में, "कर्मचारियों" एपीआई समापन बिंदु के लिए HTTP जीईटी अनुरोध को संभालने के लिए रूटिंग, नियंत्रक और डेटाबेस तर्क जोड़ें।

रूटिंग लॉजिक जोड़ना


राउटर वर्ग के साथ जहाजों को व्यक्त करें, जो उचित नियंत्रक तर्क के लिए HTTP अनुरोधों के मार्ग को सरल करता है। मार्ग पथ किसी API URL के अंतिम बिंदु को परिभाषित करते हैं और इसमें ऐसे मार्ग पैरामीटर हो सकते हैं जो URL में मान कैप्चर करते हैं।

आपके आवेदन के लिए मार्ग निर्धारित करने के कई तरीके हैं। उदाहरण के लिए, जब आवेदन शुरू होता है, तो आप नियंत्रक निर्देशिका में सभी फाइलों को पढ़ सकते हैं और स्वचालित रूप से कुछ पूर्वनिर्धारित नियमों के आधार पर रूटिंग लॉजिक उत्पन्न करते हैं, जैसे कि फ़ाइल नाम और गुण जो वे प्रदान करते हैं। वैकल्पिक रूप से, आप फ़ाइल को कॉन्फ़िगरेशन निर्देशिका में जोड़ सकते हैं और इसे स्टार्टअप पर पढ़ सकते हैं।

इस एप्लिकेशन में, आप नए राउटर मॉड्यूल के माध्यम से प्रोग्राम स्तर को परिभाषित करने वाले कुछ निचले स्तर के दृष्टिकोण का उपयोग करेंगे। सर्विसेज डायरेक्टरी में राऊटर.जेएस नामक एक नई फाइल बनाएं। फ़ाइल में निम्न कोड जोड़ें और परिवर्तनों को सहेजें।

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; 

राउटर मॉड्यूल एक्सप्रेस मॉड्यूल का अनुरोध करके शुरू होता है, और फिर राउटर एक्सप्रेस क्लास का एक नया उदाहरण बनाता है। राउटर मॉड्यूल की मार्ग विधि का उपयोग संचरित डेटा के आधार पर मार्ग को निर्धारित करने के लिए किया जाता है। पथ में एक वैकल्पिक (प्रश्न चिह्न के कारण) आईडी नाम का पैरामीटर शामिल है। राउटर से लौटे मार्ग में ऐसे तरीके हैं जो HTTP तरीकों से मेल खाते हैं और हैंडलर को परिभाषित करने की अनुमति देते हैं। इस स्थिति में, कर्मचारी नियंत्रक में परिभाषित फ़ंक्शन को आने वाले GET अनुरोध को मैप करने के लिए गेट विधि का उपयोग किया जाता है (जो नीचे बनाया जाएगा)।

फिलहाल आपके पास एक राउटर है, लेकिन इसका उपयोग एप्लिकेशन में नहीं किया जाता है। इसका उपयोग करने के लिए, सेवाओं / वेब-सर्वर.जेएस फ़ाइल खोलें और शीर्ष पर लाइन को हटा दें, जिसके लिए डेटाबेस मॉड्यूल की आवश्यकता होती है (इसका उपयोग केवल पिछले पोस्ट में परीक्षण के लिए किया गया था)। इसके स्थान पर कोड की निम्न पंक्ति जोड़ें।

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

फिर पूरे ऐप को बदलने के लिए निम्नलिखित कोड का उपयोग करें। हैंडलर, जो डेटाबेस मॉड्यूल (सभी 7 लाइनों) का उपयोग करके जीईटी अनुरोधों का जवाब देता है।

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

अब राउटर वेब सेवा मॉड्यूल में अनुरोध किया गया है और इन / एपी में "माउंटेड" है। इसका अर्थ है कि कर्मचारी समापन बिंदु के लिए पूर्ण URL http: // सर्वर: पोर्ट / एपीआई / कर्मचारी /: आईडी होगा।

नियंत्रक तर्क जोड़ना


नियंत्रक तर्क उस समय से संचालन में आ जाएगा जब समापन बिंदु URL और HTTP विधि ज्ञात हो। चूंकि वेब सर्वर एक्सप्रेस का उपयोग करके बनाया गया है, इसलिए नियंत्रक तर्क को विशेष मिडलवेयर या फ़ंक्शंस का उपयोग करके निर्धारित किया जाएगा, जिनके पास अनुरोध और प्रतिक्रिया ऑब्जेक्ट्स के साथ-साथ अगले फ़ंक्शन तक पहुंच है।

मिडलवेयर फ़ंक्शन रिस्पांस ऑब्जेक्ट से इनपुट का उपयोग करके एक प्रतिक्रिया उत्पन्न करेगा जो कि प्रतिक्रिया ऑब्जेक्ट को भेजी जाती है। अगला फ़ंक्शन आमतौर पर पाइपलाइन में अगले मिडलवेयर फ़ंक्शन को लागू करने के लिए उपयोग किया जाता है। हालांकि, इस एपीआई में, नियंत्रक तर्क पाइपलाइन में अंतिम चरण होगा और HTTP प्रतिक्रिया को पूरा करेगा। अगला फ़ंक्शन केवल तभी कहा जाएगा यदि कोई त्रुटि होती है जो मानक एक्सप्रेस त्रुटि हैंडलर पर नियंत्रण पारित करती है।

कंट्रोलर डायरेक्टरी में जाएं और एक नई फाइल बनाएं, जिसे कर्मचारी.जेएस कहते हैं । फ़ाइल में निम्न कोड को कॉपी और पेस्ट करें और परिवर्तनों को सहेजें।

 /*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: एक अतुल्यकालिक फ़ंक्शन को मिलता है जिसे घोषित किया जाता है। मुख्य बॉडी में फेंके गए अपवादों को पकड़ने और उन्हें अगले फ़ंक्शन के लिए पास करने के लिए फ़ंक्शन बॉडी में ट्राइ-कैच ब्लॉक का उपयोग किया जाता है।
लाइनें 5-7: एक नामित संदर्भ के साथ एक स्थिरांक घोषित किया जाता है - यह एक सार्वभौमिक वस्तु है जिसमें डेटाबेस एपीआई खोज विधि से संबंधित गुण होंगे। आईडी प्रॉपर्टी को उस मूल्य के आधार पर संदर्भ में जोड़ा जाता है जो req.params.id के माध्यम से आता है।
पंक्ति 9: खोज विधि का उपयोग डेटाबेस में उपयुक्त कर्मचारियों के रिकॉर्ड को पुनः प्राप्त करने के लिए किया जाता है।
पंक्तियाँ 11-19: सशर्त तर्क का उपयोग सही HTTP स्थिति कोड और प्रतिक्रिया निकाय को निर्धारित करने के लिए किया जाता है। यदि एक कर्मचारी से अनुरोध किया गया था, लेकिन नहीं मिला, तो त्रुटि कोड "404 नहीं मिला" एक प्रतिक्रिया के रूप में भेजा जाता है। अन्यथा, JSON- आधारित प्रतिक्रिया निकाय के साथ एक 200 ओके कोड भेजा जाता है।
लाइन 25: मॉड्यूल निर्यात ताकि आप अन्य मॉड्यूल में जोड़ सकें

Req.params ऑब्जेक्ट एक आने वाली अनुरोध ऑब्जेक्ट से डेटा प्राप्त करने के लिए उपयोग की जाने वाली कई गुणों में से एक है। अन्य सामान्य गुणों में URL में क्वेरी स्ट्रिंग मानों के लिए req.query, अनुरोध निकाय के लिए req.body और req.cookies शामिल हैं। HTTP हेडर को req.get पद्धति का उपयोग करके प्राप्त किया जा सकता है।

डेटाबेस लॉजिक जोड़ना


कर्मचारी डेटाबेस मॉड्यूल शुरू करने के लिए, db_apis निर्देशिका पर जाएं और कर्मचारी.जेएस नामक एक नई फ़ाइल बनाएं। फ़ाइल में निम्न कोड जोड़ें।

 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 क्वेरी के लिए एक निरंतर नामित आधार को शुरू करता है। लौटे कीज़ के मामले को नियंत्रित करने के लिए डबल-कोटेड कॉलम एलियासेस का उपयोग किया जाता है।

फिर फंक्शन नामक एक फ़ंक्शन घोषित किया जाता है, जिसका उपयोग क्वेरी को निष्पादित करने और निकाली गई पंक्तियों को वापस करने के लिए किया जाता है। यदि पास किए गए संदर्भ पैरामीटर का सही आईडी मान है, तो अनुरोध के लिए जहां क्लॉज जोड़ा गया है, इसलिए केवल एक कर्मचारी को लौटाया जाता है।

ध्यान दें कि संदर्भ .id मूल्य सीधे अनुरोध में नहीं जोड़ा गया था। इसके बजाय, एक प्लेसहोल्डर जिसका नाम है: employee_id का उपयोग किया गया था - इसे बाइंड चर कहा जाता है। सुरक्षा और प्रदर्शन के संदर्भ में ओरेकल डेटाबेस बाइंडिंग चर का उपयोग करना बहुत महत्वपूर्ण है। बाइंड वैरिएबल का मान बाइंड ऑब्जेक्ट को सौंपा गया है, जिसे डेटाबेस के साथ क्वेरी किया गया है। simpleExecute। अंत में, डेटाबेस से प्राप्त पंक्तियों को कॉलर को वापस कर दिया जाता है।

एप्लिकेशन लॉन्च करें और http: // localhost: 3000 / api / कर्मचारी पर ब्राउज़र पर जाएं। आपको कर्मचारियों की एक सूची निम्नानुसार देखनी चाहिए (मैंने एक जोड़े को ढहा दिया):
छवि
आप URL के अंत में एक पहचानकर्ता जोड़कर एक कर्मचारी का चयन कर सकते हैं, उदाहरण के लिए: http: // localhost: 3000 / api / कर्मचारी / 100।

छवि

इस बिंदु पर, आपका API कर्मचारियों के समापन बिंदु पर GET अनुरोधों को संभाल सकता है। अगली पोस्ट में, आप POST, PUT और DELETE अनुरोधों को संसाधित करने वाले तर्क को जोड़कर CRUD कार्यक्षमता का विस्तार करेंगे।

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


All Articles