परिचय: क्यों GraphQL और Go एक आदर्श जोड़ी हैं
\nआधुनिक वेब डेवलपमेंट में, GraphQL लचीले और कुशल API बनाने के लिए एक मानक बन गया है। अपनी उच्च प्रदर्शन और सरलता के लिए जानी जाने वाली Go (Golang) भाषा के साथ मिलकर, आपको बैकएंड डेवलपमेंट के लिए एक शक्तिशाली उपकरण मिलता है। इस चरण-दर-चरण ट्यूटोरियल में, हम लोकप्रिय लाइब्रेरी gqlgen का उपयोग करके शुरुआत से Go पर एक पूर्ण GraphQL API बनाएंगे।
आप सीखेंगे कि प्रोजेक्ट कैसे सेट अप करें, स्कीमा कैसे परिभाषित करें, रिज़ॉल्वर कैसे लागू करें और प्रमाणीकरण के लिए मिडलवेयर कैसे जोड़ें। लेख के अंत तक, आपके पास एक कार्यशील API होगा जो किसी भी फ्रंटएंड के साथ एकीकरण के लिए तैयार है।
\n\n1. प्रोजेक्ट सेटअप और निर्भरताएँ स्थापित करना
\nसबसे पहले, एक नया Go मॉड्यूल बनाएँ और आवश्यक पैकेज स्थापित करें। सुनिश्चित करें कि आपके पास Go संस्करण 1.18 या उच्चतर स्थापित है।
\nmkdir graphql-go-tutorial\ncd graphql-go-tutorial\ngo mod init graphql-go-tutorial\ngo get github.com/99designs/gqlgen@latest\ngo get github.com/99designs/gqlgen/graphql/introspection@latest\nअब प्रोजेक्ट में gqlgen को इनिशियलाइज़ करें। यह कमांड एक बुनियादी फ़ाइल संरचना बनाएगा:
go run github.com/99designs/gqlgen init\nनिष्पादन के बाद, आप निम्नलिखित संरचना देखेंगे:
\n- \n
graph/— स्कीमा और रिज़ॉल्वर फ़ाइलों वाली निर्देशिका \ngraph/schema.graphqls— GraphQL स्कीमा परिभाषा \ngraph/resolver.go— रिज़ॉल्वर के लिए स्टब्स \nserver.go— एप्लिकेशन का प्रवेश बिंदु \ngqlgen.yml— जनरेटर कॉन्फ़िगरेशन \n
2. GraphQL स्कीमा परिभाषित करना
\nफ़ाइल graph/schema.graphqls खोलें और अपना डेटा मॉडल परिभाषित करें। उदाहरण के लिए, एक सरल कार्य प्रबंधन प्रणाली (Task Manager) बनाएँ:
type Task {\n id: ID!\n title: String!\n description: String\n status: TaskStatus!\n createdAt: Time!\n}\n\nenum TaskStatus {\n TODO\n IN_PROGRESS\n DONE\n}\n\ntype Query {\n tasks(status: TaskStatus): [Task!]!\n task(id: ID!): Task\n}\n\ntype Mutation {\n createTask(title: String!, description: String): Task!\n updateTask(id: ID!, title: String, description: String, status: TaskStatus): Task!\n deleteTask(id: ID!): Boolean!\n}\n\nscalar Time\nस्कीमा सहेजने के बाद, कोड जनरेशन चलाएँ:
\ngo run github.com/99designs/gqlgen generate\nयह कमांड Go संरचनाओं के साथ फ़ाइल graph/model/models_gen.go बनाएगा और रिज़ॉल्वर को अपडेट करेगा।
3. रिज़ॉल्वर और व्यावसायिक तर्क को लागू करना
\nअब फ़ाइल graph/schema.resolvers.go में तर्क लागू करें। पहले, एक सरल इन-मेमोरी स्टोर बनाएँ:
// graph/resolver.go में स्टोर जोड़ें\ntype Resolver struct {\n tasks []*model.Task\n mu sync.Mutex\n}\n\nfunc NewResolver() *Resolver {\n return &Resolver{\n tasks: make([]*model.Task, 0),\n }\n}\nअब Query और Mutation के लिए रिज़ॉल्वर लागू करें:
\n// Query.Task\nfunc (r *queryResolver) Task(ctx context.Context, id string) (*model.Task, error) {\n r.mu.Lock()\n defer r.mu.Unlock()\n \n for _, task := range r.tasks {\n if task.ID == id {\n return task, nil\n }\n }\n return nil, fmt.Errorf("task not found")\n}\n\n// Mutation.CreateTask\nfunc (r *mutationResolver) CreateTask(ctx context.Context, title string, description *string) (*model.Task, error) {\n r.mu.Lock()\n defer r.mu.Unlock()\n \n task := &model.Task{\n ID: uuid.New().String(),\n Title: title,\n Description: description,\n Status: model.TaskStatusTodo,\n CreatedAt: time.Now(),\n }\n \n r.tasks = append(r.tasks, task)\n return task, nil\n}\n\n// Mutation.UpdateTask\nfunc (r *mutationResolver) UpdateTask(ctx context.Context, id string, title *string, description *string, status *model.TaskStatus) (*model.Task, error) {\n r.mu.Lock()\n defer r.mu.Unlock()\n \n for _, task