GraphQL API के साथ TypeScript: चरण-दर-चरण ट्यूटोरियल — भाग 3
ट्यूटोरियल के पिछले भागों में, हमने TypeScript पर GraphQL सर्वर बनाने की मूल बातें समझीं और सरल क्वेरी सेट अप करना सीखा। इस अंतिम भाग में, हम उन्नत तकनीकों में गहराई से उतरेंगे: म्यूटेशन, सब्सक्रिप्शन और एरर हैंडलिंग। यदि आप शुरुआती लोगों के लिए TypeScript सीख रहे हैं और आधुनिक API प्रोग्रामिंग में महारत हासिल करना चाहते हैं, तो यह सामग्री एक बेहतरीन कदम होगी। सारी सीख व्यावहारिक उदाहरणों पर आधारित है, जिसे आप तुरंत अपने प्रोजेक्ट्स में लागू कर सकते हैं।
1. TypeScript के साथ म्यूटेशन का कार्यान्वयन
म्यूटेशन डेटा बदलने (बनाना, अपडेट करना, हटाना) की क्रियाएँ हैं। GraphQL में इन्हें कीवर्ड mutation से दर्शाया जाता है। आइए एक नया उपयोगकर्ता जोड़ने के लिए म्यूटेशन बनाएँ।
पहले GraphQL स्कीमा में टाइप परिभाषित करें:
type Mutation { addUser(name: String!, email: String!): User!}अब TypeScript में रिज़ॉल्वर लागू करें। सख्त टाइपिंग पर ध्यान दें:
import { Resolver, Mutation, Arg } from 'type-graphql';import { User } from '../entities/User';
@Resolver()export class UserResolver { @Mutation(() => User) async addUser( @Arg('name') name: string, @Arg('email') email: string ): Promise<User> { const user = new User(); user.name = name; user.email = email; await user.save(); return user; }}महत्वपूर्ण: TypeScript में हम type-graphql लाइब्रेरी से @Mutation और @Arg डेकोरेटर का उपयोग करते हैं, जो कोड को साफ और टाइप-सुरक्षित बनाता है। यह विशेष रूप से बड़े प्रोजेक्ट्स की प्रोग्रामिंग के लिए उपयोगी है, जहाँ पूर्वानुमानशीलता महत्वपूर्ण है।
2. रीयल-टाइम के लिए सब्सक्रिप्शन
सब्सक्रिप्शन क्लाइंट को WebSocket के माध्यम से रीयल-टाइम अपडेट प्राप्त करने की अनुमति देते हैं। TypeScript में इनके कार्यान्वयन के लिए सर्वर की अतिरिक्त सेटिंग की आवश्यकता होती है।
नए संदेशों के लिए सब्सक्रिप्शन जोड़ें:
import { Subscription, Root } from 'type-graphql';
@Resolver()export class MessageResolver { @Subscription(() => Message, { topics: 'NEW_MESSAGE', }) newMessage(@Root() message: Message): Message { return message; }}ईवेंट प्रकाशित करने के लिए pubSub.publish('NEW_MESSAGE', message) का उपयोग करें। यह रीयल-टाइम चैट या सूचनाएँ बनाने की अनुमति देता है। सब्सक्रिप्शन प्रोग्रामिंग के शस्त्रागार में एक शक्तिशाली उपकरण हैं, और TypeScript स्थैतिक टाइपिंग के कारण उनके कार्यान्वयन को सुरक्षित बनाता है।
3. एरर हैंडलिंग और वैलिडेशन
उचित एरर हैंडलिंग एक विश्वसनीय API की कुंजी है। TypeScript में हम कस्टम एरर क्लास का उपयोग कर सकते हैं:
import { ApolloError } from 'apollo-server-express';
export class UserInputError extends ApolloError { constructor(message: string) { super(message, 'USER_INPUT_ERROR'); Object.defineProperty(this, 'name', { value: 'UserInputError' }); }}रिज़ॉल्वर में इनपुट डेटा की जाँच करें:
@Mutation(() => User)async createUser(@Arg('email') email: string) { if (!email.includes('@')) { throw new UserInputError('Invalid email format'); } // ... निर्माण का तर्क}साथ ही class-validator से वैलिडेशन डेकोरेटर का उपयोग कर सकते हैं:
import { IsEmail, Length } from 'class-validator';
class CreateUserInput { @Length(2, 50) name: string;
@IsEmail() email: string;}यह दृष्टिकोण विशेष रूप से शुरुआती लोगों के लिए TypeScript के लिए अनुशंसित है, क्योंकि यह डेटा जाँच को स्वचालित करता है और बग की संख्या को कम करता है।
4. प्रदर्शन अनुकूलन
प्रोडक्शन प्रोजेक्ट्स के लिए N+1 समस्या से बचना महत्वपूर्ण है। DataLoader का उपयोग करें ```