एक्सप्रेस.js ॲप्लिकेशन्समध्ये TypeScript मिडलवेअर समजून घेण्यासाठी आणि लागू करण्यासाठी एक विस्तृत मार्गदर्शक. मजबूत आणि टिकाऊ कोडसाठी प्रगत प्रकार पॅटर्न शोधा.
TypeScript मिडलवेअर: एक्सप्रेस मिडलवेअर प्रकार पॅटर्नमध्ये प्राविण्य मिळवणे
Express.js, एक मिनिमलिस्ट आणि लवचिक Node.js वेब ॲप्लिकेशन फ्रेमवर्क, डेव्हलपर्सना मजबूत आणि स्केलेबल API आणि वेब ॲप्लिकेशन्स तयार करण्यास अनुमती देते. TypeScript स्टॅटिक टायपिंग जोडून, कोडची टिकाऊपणा सुधारून आणि लवकर चुका शोधून एक्सप्रेसला वाढवते. मिडलवेअर फंक्शन्स एक्सप्रेसचा आधारशिला आहेत, जे तुम्हाला तुमच्या रूट हँडलर्सपर्यंत पोहोचण्यापूर्वी विनंत्या इंटरसेप्ट आणि प्रोसेस करण्यास सक्षम करतात. हा लेख एक्सप्रेस मिडलवेअर परिभाषित करण्यासाठी आणि वापरण्यासाठी प्रगत TypeScript प्रकार पॅटर्न शोधतो, ज्यामुळे प्रकार सुरक्षा आणि कोडची स्पष्टता वाढते.
एक्सप्रेस मिडलवेअर समजून घेणे
मिडलवेअर फंक्शन्स ही अशी फंक्शन्स आहेत ज्यांना विनंती ऑब्जेक्ट (req), प्रतिसाद ऑब्जेक्ट (res), आणि ॲप्लिकेशनच्या विनंती-प्रतिसाद सायकलमधील पुढील मिडलवेअर फंक्शनमध्ये प्रवेश असतो. मिडलवेअर फंक्शन्स खालील कार्ये करू शकतात:
- कोणताही कोड कार्यान्वित करणे.
- विनंती आणि प्रतिसाद ऑब्जेक्टमध्ये बदल करणे.
- विनंती-प्रतिसाद सायकल समाप्त करणे.
- स्टॅकमधील पुढील मिडलवेअर फंक्शनला कॉल करणे.
मिडलवेअर फंक्शन्स एक्सप्रेस ॲप्लिकेशनमध्ये जोडल्याप्रमाणे क्रमाने कार्यान्वित होतात. मिडलवेअरसाठी सामान्य उपयोग प्रकरणांमध्ये हे समाविष्ट आहे:
- विनंत्या लॉग करणे.
- वापरकर्त्यांना प्रमाणीकरण करणे.
- संसाधनांवर प्रवेश अधिकृत करणे.
- विनंती डेटा प्रमाणीकरण करणे.
- त्रुटी हाताळणे.
मूलभूत TypeScript मिडलवेअर
मूलभूत TypeScript एक्सप्रेस ॲप्लिकेशनमध्ये, एक मिडलवेअर फंक्शन असे दिसू शकते:
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 कन्सोलवर लॉग करते. चला प्रकार ॲनोटेशन (type annotations) पाहूया:
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}`);
});
मिडलवेअरसाठी प्रगत प्रकार पॅटर्न
मूलभूत मिडलवेअर उदाहरण कार्यात्मक असले तरी, अधिक जटिल परिस्थितींसाठी त्यात लवचिकता आणि प्रकार सुरक्षितता (type safety) यांचा अभाव आहे. चला प्रगत प्रकार पॅटर्न शोधूया जे TypeScript सह मिडलवेअर विकासाला वाढवतात.
1. सानुकूल विनंती/प्रतिसाद प्रकार
अनेकदा, तुम्हाला Request किंवा Response ऑब्जेक्ट्सना सानुकूल गुणधर्मांसह विस्तारित करण्याची आवश्यकता असेल. उदाहरणार्थ, प्रमाणीकरणानंतर, तुम्हाला Request ऑब्जेक्टमध्ये user गुणधर्म जोडायचा असेल. TypeScript तुम्हाला डिक्लेरेशन मर्जेस वापरून विद्यमान प्रकार वाढवण्याची परवानगी देते.
// 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
या उदाहरणामध्ये, आम्ही Express.Request इंटरफेसमध्ये पर्यायी user गुणधर्म समाविष्ट करण्यासाठी ते वाढवत आहोत. आता, तुमच्या प्रमाणीकरण मिडलवेअरमध्ये, तुम्ही हा गुणधर्म पॉप्युलेट करू शकता:
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. त्रुटी हाताळणी मिडलवेअर
त्रुटी हाताळणी मिडलवेअर हा एक विशेष प्रकारचा मिडलवेअर आहे जो विनंती-प्रतिसाद सायकल दरम्यान उद्भवणाऱ्या त्रुटी हाताळतो. त्रुटी हाताळणी मिडलवेअर फंक्शन्समध्ये चार वितर्क (arguments) असतात: 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 सारखे डिपेंडन्सी इंजेक्शन कंटेनर वापरू शकता किंवा तुमच्या मिडलवेअर फॅक्टरीजला डिपेंडन्सीज वितर्क (arguments) म्हणून पास करू शकता.
डिपेंडन्सी इंजेक्शनसह मिडलवेअर फॅक्टरी वापरून येथे एक उदाहरण दिले आहे:
// 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}`);
});
TypeScript मिडलवेअरसाठी सर्वोत्तम पद्धती
- मिडलवेअर फंक्शन्स लहान आणि केंद्रित ठेवा. प्रत्येक मिडलवेअर फंक्शनची एकच जबाबदारी असावी.
- तुमच्या मिडलवेअर फंक्शन्ससाठी वर्णनात्मक नावे वापरा. नावाने मिडलवेअर काय करते हे स्पष्टपणे सूचित केले पाहिजे.
- त्रुटी योग्यरित्या हाताळा. नेहमी त्रुटी पकडा आणि
next(error)वापरून त्रुटी हाताळणी मिडलवेअरला पास करा. - प्रकार सुरक्षितता वाढवण्यासाठी सानुकूल विनंती/प्रतिसाद प्रकार वापरा. आवश्यकतेनुसार
RequestआणिResponseइंटरफेसमध्ये सानुकूल गुणधर्म जोडा. - विशिष्ट पर्यायांसह मिडलवेअर कॉन्फिगर करण्यासाठी मिडलवेअर फॅक्टरीज वापरा.
- तुमच्या मिडलवेअर फंक्शन्सचे दस्तऐवजीकरण करा. मिडलवेअर काय करते आणि ते कसे वापरले पाहिजे हे स्पष्ट करा.
- तुमच्या मिडलवेअर फंक्शन्सची कसून चाचणी करा. तुमची मिडलवेअर फंक्शन्स योग्यरित्या कार्य करत असल्याची खात्री करण्यासाठी युनिट टेस्ट लिहा.
निष्कर्ष
TypeScript स्टॅटिक टायपिंग जोडून, कोडची टिकाऊपणा सुधारून आणि लवकर चुका शोधून एक्सप्रेस मिडलवेअरच्या विकासाला लक्षणीयरीत्या वाढवते. सानुकूल विनंती/प्रतिसाद प्रकार, मिडलवेअर फॅक्टरीज, असिंक्रोनस मिडलवेअर, त्रुटी हाताळणी मिडलवेअर आणि विनंती प्रमाणीकरण मिडलवेअर यांसारख्या प्रगत प्रकार पॅटर्नमध्ये प्राविण्य मिळवून, तुम्ही मजबूत, स्केलेबल आणि प्रकार-सुरक्षित एक्सप्रेस ॲप्लिकेशन्स तयार करू शकता. तुमची मिडलवेअर फंक्शन्स लहान, केंद्रित आणि सुव्यवस्थित ठेवण्यासाठी सर्वोत्तम पद्धतींचे पालन करणे लक्षात ठेवा.