Express.js अनुप्रयोगों में TypeScript मिडलवेयर को समझने और कार्यान्वित करने के लिए एक व्यापक मार्गदर्शिका। मजबूत और बनाए रखने योग्य कोड के लिए उन्नत प्रकार के पैटर्न का अन्वेषण करें।
टाइपस्क्रिप्ट मिडलवेयर: एक्सप्रेस मिडलवेयर टाइप पैटर्न्स में महारत हासिल करना
Express.js, एक न्यूनतम और लचीला Node.js वेब एप्लिकेशन फ्रेमवर्क, डेवलपर्स को मजबूत और स्केलेबल API और वेब एप्लिकेशन बनाने की अनुमति देता है। टाइपस्क्रिप्ट स्थिर टाइपिंग जोड़कर, कोड रखरखाव में सुधार और त्रुटियों को जल्दी पकड़कर एक्सप्रेस को बढ़ाता है। मिडलवेयर फ़ंक्शन एक्सप्रेस की आधारशिला हैं, जो आपको अपने मार्ग हैंडलर तक पहुंचने से पहले अनुरोधों को रोकने और संसाधित करने में सक्षम बनाते हैं। यह लेख एक्सप्रेस मिडलवेयर को परिभाषित करने और उपयोग करने के लिए उन्नत टाइपस्क्रिप्ट प्रकार के पैटर्न का पता लगाता है, जिससे प्रकार की सुरक्षा और कोड स्पष्टता बढ़ती है।
एक्सप्रेस मिडलवेयर को समझना
मिडलवेयर फ़ंक्शन वे फ़ंक्शन होते हैं जिनकी एप्लिकेशन के अनुरोध-प्रतिक्रिया चक्र में अनुरोध ऑब्जेक्ट (req), प्रतिक्रिया ऑब्जेक्ट (res) और अगले मिडलवेयर फ़ंक्शन तक पहुंच होती है। मिडलवेयर फ़ंक्शन निम्नलिखित कार्य कर सकते हैं:
- कोई भी कोड निष्पादित करें।
- अनुरोध और प्रतिक्रिया ऑब्जेक्ट में बदलाव करें।
- अनुरोध-प्रतिक्रिया चक्र समाप्त करें।
- स्टैक में अगले मिडलवेयर फ़ंक्शन को कॉल करें।
मिडलवेयर फ़ंक्शन अनुक्रमिक रूप से निष्पादित होते हैं क्योंकि उन्हें एक्सप्रेस एप्लिकेशन में जोड़ा जाता है। मिडलवेयर के लिए सामान्य उपयोग के मामलों में शामिल हैं:
- अनुरोधों को लॉग करना।
- उपयोगकर्ताओं को प्रमाणित करना।
- संसाधनों तक पहुंच को अधिकृत करना।
- अनुरोध डेटा को मान्य करना।
- त्रुटियों को संभालना।
बेसिक टाइपस्क्रिप्ट मिडलवेयर
एक बुनियादी टाइपस्क्रिप्ट एक्सप्रेस एप्लिकेशन में, एक मिडलवेयर फ़ंक्शन इस तरह दिख सकता है:
import { Request, Response, NextFunction } from 'express';
function loggerMiddleware(req: Request, res: Response, next: NextFunction) {
console.log(`Request: ${req.method} ${req.url}`);
next();
}
export default loggerMiddleware;
यह सरल मिडलवेयर अनुरोध विधि और URL को कंसोल में लॉग करता है। आइए प्रकार एनोटेशन को तोड़ते हैं:
Request: एक्सप्रेस अनुरोध ऑब्जेक्ट का प्रतिनिधित्व करता है।Response: एक्सप्रेस प्रतिक्रिया ऑब्जेक्ट का प्रतिनिधित्व करता है।NextFunction: एक फ़ंक्शन जो, आह्वान किए जाने पर, स्टैक में अगले मिडलवेयर को निष्पादित करता है।
आप इस मिडलवेयर को अपने एक्सप्रेस एप्लिकेशन में इस तरह उपयोग कर सकते हैं:
import express from 'express';
import loggerMiddleware from './middleware/loggerMiddleware';
const app = express();
const port = 3000;
app.use(loggerMiddleware);
app.get('/', (req, res) => {
res.send('Hello, world!');
});
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
मिडलवेयर के लिए उन्नत प्रकार पैटर्न
जबकि बुनियादी मिडलवेयर उदाहरण कार्यात्मक है, इसमें अधिक जटिल परिदृश्यों के लिए लचीलेपन और प्रकार की सुरक्षा का अभाव है। आइए उन्नत प्रकार के पैटर्न का पता लगाएं जो टाइपस्क्रिप्ट के साथ मिडलवेयर विकास को बढ़ाते हैं।
1. कस्टम अनुरोध/प्रतिक्रिया प्रकार
अक्सर, आपको कस्टम गुणों के साथ Request या Response ऑब्जेक्ट का विस्तार करने की आवश्यकता होगी। उदाहरण के लिए, प्रमाणीकरण के बाद, आप Request ऑब्जेक्ट में एक user गुण जोड़ना चाह सकते हैं। टाइपस्क्रिप्ट घोषणा विलय का उपयोग करके मौजूदा प्रकारों को बढ़ाने की अनुमति देता है।
// src/types/express/index.d.ts
import { Request as ExpressRequest } from 'express';
declare global {
namespace Express {
interface Request {
user?: {
id: string;
email: string;
// ... other user properties
};
}
}
}
export {}; // This is needed to make the file a module
इस उदाहरण में, हम एक वैकल्पिक user गुण को शामिल करने के लिए Express.Request इंटरफ़ेस को बढ़ा रहे हैं। अब, आपके प्रमाणीकरण मिडलवेयर में, आप इस गुण को पॉप्युलेट कर सकते हैं:
import { Request, Response, NextFunction } from 'express';
function authenticationMiddleware(req: Request, res: Response, next: NextFunction) {
// Simulate authentication logic
const userId = req.headers['x-user-id'] as string; // Or fetch from a token, etc.
if (userId) {
// In a real application, you would fetch the user from a database
req.user = {
id: userId,
email: `user${userId}@example.com`
};
next();
} else {
res.status(401).send('Unauthorized');
}
}
export default authenticationMiddleware;
और आपके मार्ग हैंडलर में, आप सुरक्षित रूप से req.user गुण तक पहुंच सकते हैं:
import express from 'express';
import authenticationMiddleware from './middleware/authenticationMiddleware';
const app = express();
const port = 3000;
app.use(authenticationMiddleware);
app.get('/profile', (req: Request, res: Response) => {
if (req.user) {
res.send(`Hello, ${req.user.email}! Your user ID is ${req.user.id}`);
} else {
// This should never happen if the middleware is working correctly
res.status(500).send('Internal Server Error');
}
});
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
2. मिडलवेयर फैक्ट्रियाँ
मिडलवेयर फैक्ट्रियाँ वे फ़ंक्शन हैं जो मिडलवेयर फ़ंक्शन लौटाते हैं। यह पैटर्न तब उपयोगी होता है जब आपको विशिष्ट विकल्पों या निर्भरताओं के साथ मिडलवेयर को कॉन्फ़िगर करने की आवश्यकता होती है। उदाहरण के लिए, एक लॉगिंग मिडलवेयर पर विचार करें जो एक विशिष्ट फ़ाइल में संदेश लॉग करता है:
import { Request, Response, NextFunction } from 'express';
import fs from 'fs';
import path from 'path';
function createLoggingMiddleware(logFilePath: string) {
return (req: Request, res: Response, next: NextFunction) => {
const logMessage = `[${new Date().toISOString()}] Request: ${req.method} ${req.url}\n`;
fs.appendFile(logFilePath, logMessage, (err) => {
if (err) {
console.error('Error writing to log file:', err);
}
next();
});
};
}
export default createLoggingMiddleware;
आप इस मिडलवेयर फैक्ट्री को इस तरह उपयोग कर सकते हैं:
import express from 'express';
import createLoggingMiddleware from './middleware/loggingMiddleware';
const app = express();
const port = 3000;
const logFilePath = path.join(__dirname, 'logs', 'requests.log');
app.use(createLoggingMiddleware(logFilePath));
app.get('/', (req, res) => {
res.send('Hello, world!');
});
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
3. एसिंक्रोनस मिडलवेयर
मिडलवेयर फ़ंक्शंस को अक्सर एसिंक्रोनस संचालन करने की आवश्यकता होती है, जैसे कि डेटाबेस क्वेरी या API कॉल। एसिंक्रोनस संचालन को सही ढंग से संभालने के लिए, आपको यह सुनिश्चित करने की आवश्यकता है कि एसिंक्रोनस ऑपरेशन पूरा होने के बाद next फ़ंक्शन को कॉल किया गया है। आप async/await या वादों का उपयोग करके इसे प्राप्त कर सकते हैं।
import { Request, Response, NextFunction } from 'express';
async function asyncMiddleware(req: Request, res: Response, next: NextFunction) {
try {
// Simulate an asynchronous operation
await new Promise(resolve => setTimeout(resolve, 100));
console.log('Asynchronous operation completed');
next();
} catch (error) {
next(error); // Pass the error to the error handling middleware
}
}
export default asyncMiddleware;
महत्वपूर्ण: अपने एसिंक्रोनस मिडलवेयर के भीतर त्रुटियों को संभालना और next(error) का उपयोग करके उन्हें त्रुटि हैंडलिंग मिडलवेयर को पास करना याद रखें। यह सुनिश्चित करता है कि त्रुटियों को ठीक से संभाला और लॉग किया गया है।
4. त्रुटि हैंडलिंग मिडलवेयर
त्रुटि हैंडलिंग मिडलवेयर एक विशेष प्रकार का मिडलवेयर है जो अनुरोध-प्रतिक्रिया चक्र के दौरान होने वाली त्रुटियों को संभालता है। त्रुटि हैंडलिंग मिडलवेयर फ़ंक्शन में चार तर्क होते हैं: err, req, res और next।
import { Request, Response, NextFunction } from 'express';
function errorHandler(err: any, req: Request, res: Response, next: NextFunction) {
console.error(err.stack);
res.status(500).send('Something went wrong!');
}
export default errorHandler;
आपको त्रुटि हैंडलिंग मिडलवेयर को अन्य सभी मिडलवेयर और मार्ग हैंडलर्स के बाद पंजीकृत करना होगा। एक्सप्रेस चार तर्कों की उपस्थिति से त्रुटि-हैंडलिंग मिडलवेयर की पहचान करता है।
import express from 'express';
import asyncMiddleware from './middleware/asyncMiddleware';
import errorHandler from './middleware/errorHandler';
const app = express();
const port = 3000;
app.use(asyncMiddleware);
app.get('/', (req, res) => {
throw new Error('Simulated error!'); // Simulate an error
});
app.use(errorHandler); // Error handling middleware MUST be registered last
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
5. अनुरोध सत्यापन मिडलवेयर
सुरक्षित और विश्वसनीय API बनाने का एक महत्वपूर्ण पहलू अनुरोध सत्यापन है। मिडलवेयर का उपयोग इनकमिंग अनुरोध डेटा को मान्य करने और यह सुनिश्चित करने के लिए किया जा सकता है कि यह आपके मार्ग हैंडलर्स तक पहुंचने से पहले कुछ मानदंडों को पूरा करता है। joi या express-validator जैसी लाइब्रेरी का उपयोग अनुरोध सत्यापन के लिए किया जा सकता है।
यहाँ express-validator का उपयोग करके एक उदाहरण दिया गया है:
import { Request, Response, NextFunction } from 'express';
import { body, validationResult } from 'express-validator';
const validateCreateUserRequest = [
body('email').isEmail().normalizeEmail(),
body('password').isLength({ min: 8 }),
(req: Request, res: Response, next: NextFunction) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
next();
}
];
export default validateCreateUserRequest;
यह मिडलवेयर अनुरोध निकाय में email और password फ़ील्ड को मान्य करता है। यदि सत्यापन विफल हो जाता है, तो यह त्रुटि संदेशों की एक सरणी के साथ 400 खराब अनुरोध प्रतिक्रिया देता है। आप इस मिडलवेयर को अपने मार्ग हैंडलर्स में इस तरह उपयोग कर सकते हैं:
import express from 'express';
import validateCreateUserRequest from './middleware/validateCreateUserRequest';
const app = express();
const port = 3000;
app.post('/users', validateCreateUserRequest, (req, res) => {
// If validation passes, create the user
res.send('User created successfully!');
});
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
6. मिडलवेयर के लिए निर्भरता इंजेक्शन
जब आपके मिडलवेयर फ़ंक्शन बाहरी सेवाओं या कॉन्फ़िगरेशन पर निर्भर करते हैं, तो निर्भरता इंजेक्शन परीक्षण और रखरखाव क्षमता को बेहतर बनाने में मदद कर सकता है। आप tsyringe जैसे निर्भरता इंजेक्शन कंटेनर का उपयोग कर सकते हैं या केवल निर्भरता को अपने मिडलवेयर कारखानों के तर्कों के रूप में पास कर सकते हैं।
यहाँ निर्भरता इंजेक्शन के साथ एक मिडलवेयर फ़ैक्टरी का उपयोग करके एक उदाहरण दिया गया है:
// src/services/UserService.ts
export class UserService {
async createUser(email: string, password: string): Promise {
// In a real application, you would save the user to a database
console.log(`Creating user with email: ${email} and password: ${password}`);
await new Promise(resolve => setTimeout(resolve, 500)); // Simulate a database operation
}
}
// src/middleware/createUserMiddleware.ts
import { Request, Response, NextFunction } from 'express';
import { UserService } from '../services/UserService';
function createCreateUserMiddleware(userService: UserService) {
return async (req: Request, res: Response, next: NextFunction) => {
try {
const { email, password } = req.body;
await userService.createUser(email, password);
res.status(201).send('User created successfully!');
} catch (error) {
next(error);
}
};
}
export default createCreateUserMiddleware;
// src/app.ts
import express from 'express';
import createCreateUserMiddleware from './middleware/createUserMiddleware';
import { UserService } from './services/UserService';
import errorHandler from './middleware/errorHandler';
const app = express();
const port = 3000;
app.use(express.json()); // Parse JSON request bodies
const userService = new UserService();
const createUserMiddleware = createCreateUserMiddleware(userService);
app.post('/users', createUserMiddleware);
app.use(errorHandler);
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
टाइपस्क्रिप्ट मिडलवेयर के लिए सर्वोत्तम अभ्यास
- मिडलवेयर फ़ंक्शंस को छोटा और केंद्रित रखें। प्रत्येक मिडलवेयर फ़ंक्शन की एक एकल जिम्मेदारी होनी चाहिए।
- अपने मिडलवेयर फ़ंक्शंस के लिए वर्णनात्मक नामों का उपयोग करें। नाम को स्पष्ट रूप से इंगित करना चाहिए कि मिडलवेयर क्या करता है।
- त्रुटियों को ठीक से संभालें। हमेशा त्रुटियों को पकड़ें और
next(error)का उपयोग करके उन्हें त्रुटि हैंडलिंग मिडलवेयर को पास करें। - प्रकार की सुरक्षा बढ़ाने के लिए कस्टम अनुरोध/प्रतिक्रिया प्रकारों का उपयोग करें। आवश्यकतानुसार कस्टम गुणों के साथ
RequestऔरResponseइंटरफेस को बढ़ाएं। - विशिष्ट विकल्पों के साथ मिडलवेयर को कॉन्फ़िगर करने के लिए मिडलवेयर फ़ैक्ट्रियों का उपयोग करें।
- अपने मिडलवेयर फ़ंक्शंस का दस्तावेज़ बनाएँ। बताएं कि मिडलवेयर क्या करता है और इसका उपयोग कैसे किया जाना चाहिए।
- अपने मिडलवेयर फ़ंक्शंस का अच्छी तरह से परीक्षण करें। यह सुनिश्चित करने के लिए यूनिट परीक्षण लिखें कि आपके मिडलवेयर फ़ंक्शन सही ढंग से काम कर रहे हैं।
निष्कर्ष
टाइपस्क्रिप्ट स्थिर टाइपिंग जोड़कर, कोड रखरखाव में सुधार और त्रुटियों को जल्दी पकड़कर एक्सप्रेस मिडलवेयर के विकास को महत्वपूर्ण रूप से बढ़ाता है। कस्टम अनुरोध/प्रतिक्रिया प्रकार, मिडलवेयर कारखानों, एसिंक्रोनस मिडलवेयर, त्रुटि हैंडलिंग मिडलवेयर और अनुरोध सत्यापन मिडलवेयर जैसे उन्नत प्रकार के पैटर्न में महारत हासिल करके, आप मजबूत, स्केलेबल और प्रकार-सुरक्षित एक्सप्रेस एप्लिकेशन बना सकते हैं। अपने मिडलवेयर फ़ंक्शंस को छोटा, केंद्रित और अच्छी तरह से प्रलेखित रखने के लिए सर्वोत्तम प्रथाओं का पालन करना याद रखें।