टाइपस्क्रिप्ट का उपयोग करके मजबूत टाइप सेफ्टी के साथ अपने Express.js एप्लिकेशन को बेहतर बनाएं। यह गाइड रूट हैंडलर परिभाषाओं, मिडलवेयर टाइपिंग, और स्केलेबल और मेंटेनेबल API बनाने के लिए सर्वोत्तम प्रथाओं को कवर करता है।
टाइपस्क्रिप्ट एक्सप्रेस इंटीग्रेशन: रूट हैंडलर टाइप सेफ्टी
टाइपस्क्रिप्ट आधुनिक जावास्क्रिप्ट डेवलपमेंट का एक आधार बन गया है, जो स्टैटिक टाइपिंग क्षमताएं प्रदान करता है जो कोड की गुणवत्ता, मेंटेनेबिलिटी और स्केलेबिलिटी को बढ़ाता है। जब इसे Express.js, एक लोकप्रिय Node.js वेब एप्लिकेशन फ्रेमवर्क, के साथ जोड़ा जाता है, तो टाइपस्क्रिप्ट आपके बैकएंड API की मजबूती को काफी सुधार सकता है। यह व्यापक गाइड बताता है कि Express.js एप्लिकेशन्स में रूट हैंडलर टाइप सेफ्टी प्राप्त करने के लिए टाइपस्क्रिप्ट का लाभ कैसे उठाया जाए, जिसमें वैश्विक दर्शकों के लिए मजबूत और मेंटेनेबल API बनाने के लिए व्यावहारिक उदाहरण और सर्वोत्तम प्रथाएं प्रदान की गई हैं।
Express.js में टाइप सेफ्टी क्यों महत्वपूर्ण है
जावास्क्रिप्ट जैसी डायनामिक भाषाओं में, त्रुटियाँ अक्सर रनटाइम पर पकड़ी जाती हैं, जिससे अप्रत्याशित व्यवहार और डीबग करने में मुश्किल समस्याएं हो सकती हैं। टाइपस्क्रिप्ट स्टैटिक टाइपिंग पेश करके इस समस्या का समाधान करता है, जिससे आप डेवलपमेंट के दौरान त्रुटियों को पकड़ सकते हैं, इससे पहले कि वे प्रोडक्शन में पहुंचें। Express.js के संदर्भ में, टाइप सेफ्टी रूट हैंडलर्स के लिए विशेष रूप से महत्वपूर्ण है, जहां आप रिक्वेस्ट और रिस्पांस ऑब्जेक्ट्स, क्वेरी पैरामीटर्स और रिक्वेस्ट बॉडीज के साथ काम कर रहे होते हैं। इन तत्वों का गलत हैंडलिंग एप्लिकेशन क्रैश, डेटा करप्शन और सुरक्षा कमजोरियों का कारण बन सकता है।
- जल्दी त्रुटि का पता लगाना: डेवलपमेंट के दौरान टाइप-संबंधी त्रुटियों को पकड़ें, जिससे रनटाइम में आने वाली अप्रत्याशित समस्याओं की संभावना कम हो जाती है।
- बेहतर कोड मेंटेनेबिलिटी: टाइप एनोटेशन कोड को समझना और रीफैक्टर करना आसान बनाते हैं।
- बेहतर कोड कंप्लीशन और टूलिंग: IDEs टाइप जानकारी के साथ बेहतर सुझाव और त्रुटि जांच प्रदान कर सकते हैं।
- कम बग्स: टाइप सेफ्टी सामान्य प्रोग्रामिंग त्रुटियों को रोकने में मदद करती है, जैसे कि फंक्शन्स में गलत डेटा प्रकार पास करना।
एक टाइपस्क्रिप्ट Express.js प्रोजेक्ट सेट अप करना
रूट हैंडलर टाइप सेफ्टी में गोता लगाने से पहले, आइए एक बेसिक टाइपस्क्रिप्ट Express.js प्रोजेक्ट सेट अप करें। यह हमारे उदाहरणों के लिए नींव के रूप में काम करेगा।
आवश्यक शर्तें
- Node.js और npm (नोड पैकेज मैनेजर) इंस्टॉल होना चाहिए। आप उन्हें आधिकारिक Node.js वेबसाइट से डाउनलोड कर सकते हैं। सुनिश्चित करें कि आपके पास इष्टतम संगतता के लिए एक हालिया संस्करण है।
- विजुअल स्टूडियो कोड जैसा एक कोड एडिटर, जो उत्कृष्ट टाइपस्क्रिप्ट समर्थन प्रदान करता है।
प्रोजेक्ट इनिशियलाइज़ेशन
- एक नई प्रोजेक्ट डायरेक्टरी बनाएं:
mkdir typescript-express-app && cd typescript-express-app - एक नया npm प्रोजेक्ट इनिशियलाइज़ करें:
npm init -y - टाइपस्क्रिप्ट और Express.js इंस्टॉल करें:
npm install typescript express - Express.js के लिए टाइपस्क्रिप्ट डिक्लेरेशन फाइलें इंस्टॉल करें (टाइप सेफ्टी के लिए महत्वपूर्ण):
npm install @types/express @types/node - टाइपस्क्रिप्ट इनिशियलाइज़ करें:
npx tsc --init(यह एकtsconfig.jsonफ़ाइल बनाता है, जो टाइपस्क्रिप्ट कंपाइलर को कॉन्फ़िगर करती है।)
टाइपस्क्रिप्ट को कॉन्फ़िगर करना
tsconfig.json फ़ाइल खोलें और इसे उचित रूप से कॉन्फ़िगर करें। यहाँ एक नमूना कॉन्फ़िगरेशन है:
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
}
}
ध्यान देने योग्य मुख्य कॉन्फ़िगरेशन:
target: ECMAScript टारगेट संस्करण निर्दिष्ट करता है।es6एक अच्छा शुरुआती बिंदु है।module: मॉड्यूल कोड जनरेशन निर्दिष्ट करता है।commonjsNode.js के लिए एक आम पसंद है।outDir: कंपाइल्ड जावास्क्रिप्ट फ़ाइलों के लिए आउटपुट डायरेक्टरी निर्दिष्ट करता है।rootDir: आपके टाइपस्क्रिप्ट स्रोत फ़ाइलों की रूट डायरेक्टरी निर्दिष्ट करता है।strict: बेहतर टाइप सेफ्टी के लिए सभी सख्त टाइप-चेकिंग विकल्पों को सक्षम करता है। इसकी अत्यधिक अनुशंसा की जाती है।esModuleInterop: CommonJS और ES मॉड्यूल्स के बीच इंटरऑपरेबिलिटी को सक्षम करता है।
एंट्री प्वाइंट बनाना
एक src डायरेक्टरी बनाएं और एक index.ts फ़ाइल जोड़ें:
mkdir src
touch src/index.ts
src/index.ts को एक बेसिक Express.js सर्वर सेटअप से भरें:
import express, { Request, Response } from 'express';
const app = express();
const port = 3000;
app.get('/', (req: Request, res: Response) => {
res.send('Hello, TypeScript Express!');
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
एक बिल्ड स्क्रिप्ट जोड़ना
टाइपस्क्रिप्ट कोड को कंपाइल करने के लिए अपनी package.json फ़ाइल में एक बिल्ड स्क्रिप्ट जोड़ें:
"scripts": {
"build": "tsc",
"start": "node dist/index.js",
"dev": "npm run build && npm run start"
}
अब आप सर्वर को बनाने और शुरू करने के लिए npm run dev चला सकते हैं।
रूट हैंडलर टाइप सेफ्टी: रिक्वेस्ट और रिस्पांस प्रकारों को परिभाषित करना
रूट हैंडलर टाइप सेफ्टी का मूल Request और Response ऑब्जेक्ट्स के लिए प्रकारों को ठीक से परिभाषित करने में निहित है। Express.js इन ऑब्जेक्ट्स के लिए जेनेरिक प्रकार प्रदान करता है जो आपको क्वेरी पैरामीटर्स, रिक्वेस्ट बॉडी और रूट पैरामीटर्स के प्रकारों को निर्दिष्ट करने की अनुमति देते हैं।
बेसिक रूट हैंडलर प्रकार
आइए एक सरल रूट हैंडलर से शुरू करें जो एक क्वेरी पैरामीटर के रूप में एक नाम की अपेक्षा करता है:
import express, { Request, Response } from 'express';
const app = express();
const port = 3000;
interface NameQuery {
name: string;
}
app.get('/hello', (req: Request, res: Response) => {
const name = req.query.name;
if (!name) {
return res.status(400).send('Name parameter is required.');
}
res.send(`Hello, ${name}!`);
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
इस उदाहरण में:
Request<any, any, any, NameQuery>रिक्वेस्ट ऑब्जेक्ट के लिए प्रकार को परिभाषित करता है।- पहला
anyरूट पैरामीटर्स का प्रतिनिधित्व करता है (उदाहरण के लिए,/users/:id)। - दूसरा
anyरिस्पांस बॉडी प्रकार का प्रतिनिधित्व करता है। - तीसरा
anyरिक्वेस्ट बॉडी प्रकार का प्रतिनिधित्व करता है। NameQueryएक इंटरफ़ेस है जो क्वेरी पैरामीटर्स की संरचना को परिभाषित करता है।
NameQuery इंटरफ़ेस को परिभाषित करके, टाइपस्क्रिप्ट अब यह सत्यापित कर सकता है कि req.query.name प्रॉपर्टी मौजूद है और string प्रकार की है। यदि आप किसी गैर-मौजूद प्रॉपर्टी तक पहुंचने का प्रयास करते हैं या गलत प्रकार का मान निर्दिष्ट करते हैं, तो टाइपस्क्रिप्ट एक त्रुटि को चिह्नित करेगा।
रिक्वेस्ट बॉडीज को हैंडल करना
उन रूट्स के लिए जो रिक्वेस्ट बॉडीज स्वीकार करते हैं (जैसे, POST, PUT, PATCH), आप रिक्वेस्ट बॉडी के लिए एक इंटरफ़ेस परिभाषित कर सकते हैं और इसे Request प्रकार में उपयोग कर सकते हैं:
import express, { Request, Response } from 'express';
import bodyParser from 'body-parser';
const app = express();
const port = 3000;
app.use(bodyParser.json()); // JSON रिक्वेस्ट बॉडीज को पार्स करने के लिए महत्वपूर्ण
interface CreateUserRequest {
firstName: string;
lastName: string;
email: string;
}
app.post('/users', (req: Request, res: Response) => {
const { firstName, lastName, email } = req.body;
// रिक्वेस्ट बॉडी को मान्य करें
if (!firstName || !lastName || !email) {
return res.status(400).send('Missing required fields.');
}
// उपयोगकर्ता निर्माण की प्रक्रिया करें (जैसे, डेटाबेस में सहेजना)
console.log(`Creating user: ${firstName} ${lastName} (${email})`);
res.status(201).send('User created successfully.');
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
इस उदाहरण में:
CreateUserRequestअपेक्षित रिक्वेस्ट बॉडी की संरचना को परिभाषित करता है।app.use(bodyParser.json())JSON रिक्वेस्ट बॉडीज को पार्स करने के लिए महत्वपूर्ण है। इसके बिना,req.bodyअपरिभाषित होगा।Requestप्रकार अबRequest<any, any, CreateUserRequest>है, जो यह दर्शाता है कि रिक्वेस्ट बॉडी कोCreateUserRequestइंटरफ़ेस के अनुरूप होना चाहिए।
टाइपस्क्रिप्ट अब यह सुनिश्चित करेगा कि req.body ऑब्जेक्ट में अपेक्षित गुण (firstName, lastName, और email) हैं और उनके प्रकार सही हैं। यह गलत रिक्वेस्ट बॉडी डेटा के कारण होने वाली रनटाइम त्रुटियों के जोखिम को काफी कम करता है।
रूट पैरामीटर्स को हैंडल करना
पैरामीटर्स वाले रूट्स के लिए (जैसे, /users/:id), आप रूट पैरामीटर्स के लिए एक इंटरफ़ेस परिभाषित कर सकते हैं और इसे Request प्रकार में उपयोग कर सकते हैं:
import express, { Request, Response } from 'express';
const app = express();
const port = 3000;
interface UserParams {
id: string;
}
interface User {
id: string;
firstName: string;
lastName: string;
email: string;
}
const users: User[] = [
{ id: '1', firstName: 'John', lastName: 'Doe', email: 'john.doe@example.com' },
{ id: '2', firstName: 'Jane', lastName: 'Smith', email: 'jane.smith@example.com' },
];
app.get('/users/:id', (req: Request, res: Response) => {
const userId = req.params.id;
const user = users.find(u => u.id === userId);
if (!user) {
return res.status(404).send('User not found.');
}
res.json(user);
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
इस उदाहरण में:
UserParamsरूट पैरामीटर्स की संरचना को परिभाषित करता है, यह निर्दिष्ट करते हुए किidपैरामीटर एक स्ट्रिंग होना चाहिए।Requestप्रकार अबRequest<UserParams>है, जो यह दर्शाता है किreq.paramsऑब्जेक्ट कोUserParamsइंटरफ़ेस के अनुरूप होना चाहिए।
टाइपस्क्रिप्ट अब यह सुनिश्चित करेगा कि req.params.id प्रॉपर्टी मौजूद है और string प्रकार की है। यह गैर-मौजूद रूट पैरामीटर्स तक पहुंचने या उन्हें गलत प्रकारों के साथ उपयोग करने के कारण होने वाली त्रुटियों को रोकने में मदद करता है।
रिस्पांस प्रकारों को निर्दिष्ट करना
जबकि रिक्वेस्ट टाइप सेफ्टी पर ध्यान केंद्रित करना महत्वपूर्ण है, रिस्पांस प्रकारों को परिभाषित करना भी कोड की स्पष्टता को बढ़ाता है और विसंगतियों को रोकने में मदद करता है। आप उस डेटा का प्रकार परिभाषित कर सकते हैं जिसे आप रिस्पांस में वापस भेज रहे हैं।
import express, { Request, Response } from 'express';
const app = express();
const port = 3000;
interface User {
id: string;
firstName: string;
lastName: string;
email: string;
}
const users: User[] = [
{ id: '1', firstName: 'John', lastName: 'Doe', email: 'john.doe@example.com' },
{ id: '2', firstName: 'Jane', lastName: 'Smith', email: 'jane.smith@example.com' },
];
app.get('/users', (req: Request, res: Response) => {
res.json(users);
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
यहाँ, Response<User[]> यह निर्दिष्ट करता है कि रिस्पांस बॉडी User ऑब्जेक्ट्स की एक ऐरे होनी चाहिए। यह सुनिश्चित करने में मदद करता है कि आप अपने API रिस्पांस में लगातार सही डेटा संरचना भेज रहे हैं। यदि आप ऐसा डेटा भेजने का प्रयास करते हैं जो `User[]` प्रकार के अनुरूप नहीं है, तो टाइपस्क्रिप्ट एक चेतावनी जारी करेगा।
मिडलवेयर टाइप सेफ्टी
मिडलवेयर फ़ंक्शंस Express.js एप्लिकेशन्स में क्रॉस-कटिंग चिंताओं को संभालने के लिए आवश्यक हैं। मिडलवेयर में टाइप सेफ्टी सुनिश्चित करना उतना ही महत्वपूर्ण है जितना कि रूट हैंडलर्स में।
मिडलवेयर फ़ंक्शंस को टाइप करना
टाइपस्क्रिप्ट में एक मिडलवेयर फ़ंक्शन की मूल संरचना एक रूट हैंडलर के समान होती है:
import express, { Request, Response, NextFunction } from 'express';
function authenticationMiddleware(req: Request, res: Response, next: NextFunction) {
// प्रमाणीकरण तर्क
const isAuthenticated = true; // वास्तविक प्रमाणीकरण जांच से बदलें
if (isAuthenticated) {
next(); // अगले मिडलवेयर या रूट हैंडलर पर जाएं
} else {
res.status(401).send('Unauthorized');
}
}
const app = express();
const port = 3000;
app.use(authenticationMiddleware);
app.get('/', (req: Request, res: Response) => {
res.send('Hello, authenticated user!');
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
इस उदाहरण में:
NextFunctionExpress.js द्वारा प्रदान किया गया एक प्रकार है जो श्रृंखला में अगले मिडलवेयर फ़ंक्शन का प्रतिनिधित्व करता है।- मिडलवेयर फ़ंक्शन रूट हैंडलर्स के समान
RequestऔरResponseऑब्जेक्ट्स लेता है।
रिक्वेस्ट ऑब्जेक्ट को ऑगमेंट करना
कभी-कभी, आप अपने मिडलवेयर में Request ऑब्जेक्ट में कस्टम गुण जोड़ना चाह सकते हैं। उदाहरण के लिए, एक प्रमाणीकरण मिडलवेयर रिक्वेस्ट ऑब्जेक्ट में एक user गुण जोड़ सकता है। इसे टाइप-सेफ तरीके से करने के लिए, आपको Request इंटरफ़ेस को ऑगमेंट करना होगा।
import express, { Request, Response, NextFunction } from 'express';
interface User {
id: string;
username: string;
email: string;
}
// Request इंटरफ़ेस को ऑगमेंट करें
declare global {
namespace Express {
interface Request {
user?: User;
}
}
}
function authenticationMiddleware(req: Request, res: Response, next: NextFunction) {
// प्रमाणीकरण तर्क (वास्तविक प्रमाणीकरण जांच से बदलें)
const user: User = { id: '123', username: 'johndoe', email: 'john.doe@example.com' };
req.user = user; // उपयोगकर्ता को रिक्वेस्ट ऑब्जेक्ट में जोड़ें
next(); // अगले मिडलवेयर या रूट हैंडलर पर जाएं
}
const app = express();
const port = 3000;
app.use(authenticationMiddleware);
app.get('/', (req: Request, res: Response) => {
const username = req.user?.username || 'Guest';
res.send(`Hello, ${username}!`);
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
इस उदाहरण में:
- हम
Express.Requestइंटरफ़ेस को ऑगमेंट करने के लिए एक वैश्विक घोषणा का उपयोग करते हैं। - हम
Requestइंटरफ़ेस मेंUserप्रकार का एक वैकल्पिकuserगुण जोड़ते हैं। - अब, आप टाइपस्क्रिप्ट की शिकायत के बिना अपने रूट हैंडलर्स में
req.userगुण तक पहुंच सकते हैं। `req.user?.username` में `?` उन मामलों को संभालने के लिए महत्वपूर्ण है जहां उपयोगकर्ता प्रमाणित नहीं है, जिससे संभावित त्रुटियों को रोका जा सकता है।
टाइपस्क्रिप्ट एक्सप्रेस इंटीग्रेशन के लिए सर्वोत्तम प्रथाएं
अपने Express.js एप्लिकेशन्स में टाइपस्क्रिप्ट के लाभों को अधिकतम करने के लिए, इन सर्वोत्तम प्रथाओं का पालन करें:
- स्ट्रिक्ट मोड सक्षम करें: सभी सख्त टाइप-चेकिंग विकल्पों को सक्षम करने के लिए अपनी
tsconfig.jsonफ़ाइल में"strict": trueविकल्प का उपयोग करें। यह संभावित त्रुटियों को जल्दी पकड़ने में मदद करता है और उच्च स्तर की टाइप सेफ्टी सुनिश्चित करता है। - इंटरफेस और टाइप अलियास का उपयोग करें: अपने डेटा की संरचना का प्रतिनिधित्व करने के लिए इंटरफेस और टाइप अलियास को परिभाषित करें। यह आपके कोड को अधिक पठनीय और मेंटेनेबल बनाता है।
- जेनेरिक प्रकारों का उपयोग करें: पुन: प्रयोज्य और टाइप-सेफ कंपोनेंट्स बनाने के लिए जेनेरिक प्रकारों का लाभ उठाएं।
- यूनिट टेस्ट लिखें: अपने कोड की शुद्धता को सत्यापित करने और यह सुनिश्चित करने के लिए कि आपके टाइप एनोटेशन सटीक हैं, यूनिट टेस्ट लिखें। कोड की गुणवत्ता बनाए रखने के लिए परीक्षण महत्वपूर्ण है।
- लिंटर और फॉर्मैटर का उपयोग करें: सुसंगत कोडिंग शैलियों को लागू करने और संभावित त्रुटियों को पकड़ने के लिए एक लिंटर (जैसे ESLint) और एक फॉर्मैटर (जैसे Prettier) का उपयोग करें।
anyप्रकार से बचें:anyप्रकार के उपयोग को कम से कम करें, क्योंकि यह टाइप चेकिंग को बायपास करता है और टाइपस्क्रिप्ट का उपयोग करने के उद्देश्य को विफल करता है। इसे केवल तभी उपयोग करें जब बिल्कुल आवश्यक हो, और जब भी संभव हो अधिक विशिष्ट प्रकारों या जेनेरिक्स का उपयोग करने पर विचार करें।- अपने प्रोजेक्ट को तार्किक रूप से संरचित करें: अपने प्रोजेक्ट को कार्यक्षमता के आधार पर मॉड्यूल या फ़ोल्डर्स में व्यवस्थित करें। यह आपके एप्लिकेशन की मेंटेनेबिलिटी और स्केलेबिलिटी में सुधार करेगा।
- डिपेंडेंसी इंजेक्शन का उपयोग करें: अपने एप्लिकेशन की निर्भरताओं को प्रबंधित करने के लिए एक डिपेंडेंसी इंजेक्शन कंटेनर का उपयोग करने पर विचार करें। यह आपके कोड को अधिक परीक्षण योग्य और मेंटेनेबल बना सकता है। InversifyJS जैसी लाइब्रेरी लोकप्रिय विकल्प हैं।
Express.js के लिए उन्नत टाइपस्क्रिप्ट अवधारणाएं
डेकोरेटर्स का उपयोग करना
डेकोरेटर्स क्लासेस और फंक्शन्स में मेटाडेटा जोड़ने का एक संक्षिप्त और अभिव्यंजक तरीका प्रदान करते हैं। आप Express.js में रूट रजिस्ट्रेशन को सरल बनाने के लिए डेकोरेटर्स का उपयोग कर सकते हैं।
सबसे पहले, आपको अपनी tsconfig.json फ़ाइल में प्रायोगिक डेकोरेटर्स को compilerOptions में "experimentalDecorators": true जोड़कर सक्षम करना होगा।
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"experimentalDecorators": true
}
}
फिर, आप रूट्स को पंजीकृत करने के लिए एक कस्टम डेकोरेटर बना सकते हैं:
import express, { Router, Request, Response } from 'express';
function route(method: string, path: string) {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
if (!target.__router__) {
target.__router__ = Router();
}
target.__router__[method](path, descriptor.value);
};
}
class UserController {
@route('get', '/users')
getUsers(req: Request, res: Response) {
res.send('List of users');
}
@route('post', '/users')
createUser(req: Request, res: Response) {
res.status(201).send('User created');
}
public getRouter() {
return this.__router__;
}
}
const userController = new UserController();
const app = express();
const port = 3000;
app.use('/', userController.getRouter());
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
इस उदाहरण में:
routeडेकोरेटर HTTP मेथड और पाथ को आर्ग्यूमेंट्स के रूप में लेता है।- यह डेकोरेटेड मेथड को क्लास से जुड़े राउटर पर एक रूट हैंडलर के रूप में पंजीकृत करता है।
- यह रूट रजिस्ट्रेशन को सरल बनाता है और आपके कोड को अधिक पठनीय बनाता है।
कस्टम टाइप गार्ड्स का उपयोग करना
टाइप गार्ड्स ऐसे फंक्शन्स हैं जो एक विशिष्ट स्कोप के भीतर एक चर के प्रकार को संकीर्ण करते हैं। आप रिक्वेस्ट बॉडीज या क्वेरी पैरामीटर्स को मान्य करने के लिए कस्टम टाइप गार्ड्स का उपयोग कर सकते हैं।
interface Product {
id: string;
name: string;
price: number;
}
function isProduct(obj: any): obj is Product {
return typeof obj === 'object' &&
obj !== null &&
typeof obj.id === 'string' &&
typeof obj.name === 'string' &&
typeof obj.price === 'number';
}
import express, { Request, Response } from 'express';
import bodyParser from 'body-parser';
const app = express();
const port = 3000;
app.use(bodyParser.json());
app.post('/products', (req: Request, res: Response) => {
if (!isProduct(req.body)) {
return res.status(400).send('Invalid product data');
}
const product: Product = req.body;
console.log(`Creating product: ${product.name}`);
res.status(201).send('Product created');
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
इस उदाहरण में:
isProductफ़ंक्शन एक कस्टम टाइप गार्ड है जो यह जांचता है कि क्या कोई ऑब्जेक्टProductइंटरफ़ेस के अनुरूप है।/productsरूट हैंडलर के अंदर,isProductफ़ंक्शन का उपयोग रिक्वेस्ट बॉडी को मान्य करने के लिए किया जाता है।- यदि रिक्वेस्ट बॉडी एक मान्य उत्पाद है, तो टाइपस्क्रिप्ट जानता है कि
req.bodyifब्लॉक के भीतरProductप्रकार का है।
API डिजाइन में वैश्विक विचारों को संबोधित करना
वैश्विक दर्शकों के लिए API डिजाइन करते समय, पहुंच, प्रयोज्यता और सांस्कृतिक संवेदनशीलता सुनिश्चित करने के लिए कई कारकों पर विचार किया जाना चाहिए।
- स्थानीयकरण और अंतर्राष्ट्रीयकरण (i18n और L10n):
- कंटेंट नेगोशिएशन:
Accept-Languageहेडर के आधार पर कंटेंट नेगोशिएशन के माध्यम से कई भाषाओं और क्षेत्रों का समर्थन करें। - दिनांक और समय स्वरूपण: विभिन्न क्षेत्रों में अस्पष्टता से बचने के लिए दिनांक और समय प्रतिनिधित्व के लिए ISO 8601 प्रारूप का उपयोग करें।
- संख्या स्वरूपण: उपयोगकर्ता के लोकेल के अनुसार संख्या स्वरूपण को संभालें (जैसे, दशमलव विभाजक और हजार विभाजक)।
- मुद्रा हैंडलिंग: कई मुद्राओं का समर्थन करें और जहां आवश्यक हो, विनिमय दर की जानकारी प्रदान करें।
- टेक्स्ट दिशा: अरबी और हिब्रू जैसी दाएं-से-बाएं (RTL) भाषाओं को समायोजित करें।
- कंटेंट नेगोशिएशन:
- समय क्षेत्र:
- सर्वर साइड पर UTC (समन्वित सार्वभौमिक समय) में दिनांक और समय संग्रहीत करें।
- उपयोगकर्ताओं को अपना पसंदीदा समय क्षेत्र निर्दिष्ट करने की अनुमति दें और क्लाइंट साइड पर तदनुसार दिनांक और समय परिवर्तित करें।
- समय क्षेत्र रूपांतरणों को संभालने के लिए
moment-timezoneजैसी लाइब्रेरी का उपयोग करें।
- कैरेक्टर एन्कोडिंग:
- विभिन्न भाषाओं के वर्णों की एक विस्तृत श्रृंखला का समर्थन करने के लिए सभी टेक्स्ट डेटा के लिए UTF-8 एन्कोडिंग का उपयोग करें।
- सुनिश्चित करें कि आपका डेटाबेस और अन्य डेटा स्टोरेज सिस्टम UTF-8 का उपयोग करने के लिए कॉन्फ़िगर किए गए हैं।
- अभिगम्यता:
- अपने API को विकलांग उपयोगकर्ताओं के लिए सुलभ बनाने के लिए अभिगम्यता दिशानिर्देशों (जैसे, WCAG) का पालन करें।
- स्पष्ट और वर्णनात्मक त्रुटि संदेश प्रदान करें जो समझने में आसान हों।
- अपने API दस्तावेज़ीकरण में सिमेंटिक HTML तत्वों और ARIA विशेषताओं का उपयोग करें।
- सांस्कृतिक संवेदनशीलता:
- सांस्कृतिक रूप से विशिष्ट संदर्भों, मुहावरों या हास्य का उपयोग करने से बचें जो सभी उपयोगकर्ताओं द्वारा नहीं समझा जा सकता है।
- संचार शैलियों और वरीयताओं में सांस्कृतिक अंतरों के प्रति सचेत रहें।
- विभिन्न सांस्कृतिक समूहों पर अपने API के संभावित प्रभाव पर विचार करें और रूढ़ियों या पूर्वाग्रहों को बढ़ावा देने से बचें।
- डेटा गोपनीयता और सुरक्षा:
- GDPR (सामान्य डेटा संरक्षण विनियमन) और CCPA (कैलिफ़ोर्निया उपभोक्ता गोपनीयता अधिनियम) जैसे डेटा गोपनीयता नियमों का पालन करें।
- उपयोगकर्ता डेटा की सुरक्षा के लिए मजबूत प्रमाणीकरण और प्राधिकरण तंत्र लागू करें।
- संवेदनशील डेटा को ट्रांज़िट और रेस्ट दोनों में एन्क्रिप्ट करें।
- उपयोगकर्ताओं को उनके डेटा पर नियंत्रण प्रदान करें और उन्हें अपने डेटा तक पहुंचने, संशोधित करने और हटाने की अनुमति दें।
- API दस्तावेज़ीकरण:
- व्यापक और सुव्यवस्थित API दस्तावेज़ीकरण प्रदान करें जो समझने और नेविगेट करने में आसान हो।
- इंटरैक्टिव API दस्तावेज़ीकरण उत्पन्न करने के लिए Swagger/OpenAPI जैसे टूल का उपयोग करें।
- विविध दर्शकों को पूरा करने के लिए कई प्रोग्रामिंग भाषाओं में कोड उदाहरण शामिल करें।
- व्यापक दर्शकों तक पहुंचने के लिए अपने API दस्तावेज़ीकरण का कई भाषाओं में अनुवाद करें।
- त्रुटि हैंडलिंग:
- विशिष्ट और जानकारीपूर्ण त्रुटि संदेश प्रदान करें। "कुछ गलत हो गया" जैसे सामान्य त्रुटि संदेशों से बचें।
- त्रुटि के प्रकार को इंगित करने के लिए मानक HTTP स्थिति कोड का उपयोग करें (जैसे, 400 बैड रिक्वेस्ट के लिए, 401 अनधिकृत के लिए, 500 आंतरिक सर्वर त्रुटि के लिए)।
- त्रुटि कोड या पहचानकर्ता शामिल करें जिनका उपयोग समस्याओं को ट्रैक करने और डीबग करने के लिए किया जा सकता है।
- डीबगिंग और निगरानी के लिए सर्वर साइड पर त्रुटियों को लॉग करें।
- रेट लिमिटिंग: अपने API को दुरुपयोग से बचाने और उचित उपयोग सुनिश्चित करने के लिए रेट लिमिटिंग लागू करें।
- संस्करण: पिछड़े-संगत परिवर्तनों की अनुमति देने और मौजूदा क्लाइंट को तोड़ने से बचने के लिए API संस्करण का उपयोग करें।
निष्कर्ष
टाइपस्क्रिप्ट एक्सप्रेस इंटीग्रेशन आपके बैकएंड API की विश्वसनीयता और मेंटेनेबिलिटी में काफी सुधार करता है। रूट हैंडलर्स और मिडलवेयर में टाइप सेफ्टी का लाभ उठाकर, आप डेवलपमेंट प्रक्रिया में जल्दी त्रुटियों को पकड़ सकते हैं और वैश्विक दर्शकों के लिए अधिक मजबूत और स्केलेबल एप्लिकेशन बना सकते हैं। रिक्वेस्ट और रिस्पांस प्रकारों को परिभाषित करके, आप यह सुनिश्चित करते हैं कि आपका API एक सुसंगत डेटा संरचना का पालन करता है, जिससे रनटाइम त्रुटियों की संभावना कम हो जाती है। टाइपस्क्रिप्ट के लाभों को अधिकतम करने के लिए स्ट्रिक्ट मोड सक्षम करने, इंटरफेस और टाइप अलियास का उपयोग करने और यूनिट टेस्ट लिखने जैसी सर्वोत्तम प्रथाओं का पालन करना याद रखें। अपने API को दुनिया भर में सुलभ और उपयोग करने योग्य बनाने के लिए हमेशा स्थानीयकरण, समय क्षेत्र और सांस्कृतिक संवेदनशीलता जैसे वैश्विक कारकों पर विचार करें।