গ্রাফকিউএল (GraphQL)-এ Error Handling খুবই গুরুত্বপূর্ণ, কারণ এটি API এর মাধ্যমে ডেটা প্রসেসিংয়ে সমস্যা বা ব্যতিক্রম মোকাবেলা করতে সাহায্য করে। গ্রাফকিউএল একটি নির্দিষ্ট এবং স্ট্রাকচারড পদ্ধতিতে ত্রুটিগুলিকে মোকাবেলা করার সুযোগ দেয়, যা ডেভেলপারদের দ্রুত ডিবাগ এবং সমস্যা সমাধান করতে সাহায্য করে। গ্রাফকিউএল-এ ত্রুটি পরিচালনা করার জন্য সাধারণত Error Object ব্যবহৃত হয় এবং কাস্টম ত্রুটি বার্তা (Custom Error Messages) তৈরি করা হয়।
গ্রাফকিউএল ত্রুটি কীভাবে কাজ করে?
গ্রাফকিউএল ত্রুটি errors ফিল্ডের মাধ্যমে রিটার্ন করা হয়, যা মূলত একটি অ্যারে হয়। প্রতিটি ত্রুটির মধ্যে message, path, এবং কখনো কখনো extensions ফিল্ড থাকতে পারে। এই ত্রুটির তথ্যের মাধ্যমে ক্লায়েন্টরা সমস্যা সম্পর্কে বিস্তারিত জানতে পারে।
যখন গ্রাফকিউএল কুয়েরি সম্পাদন করতে গিয়ে কোনো সমস্যা ঘটে (যেমন, একটি ফিল্ড খুঁজে পাওয়া যায়নি বা কোনো ভ্যালিডেশন ত্রুটি), তখন সার্ভার ত্রুটি হিসেবে সেই তথ্য errors ফিল্ডে যুক্ত করে। যদিও কুয়েরি বা মিউটেশন একটি ত্রুটির মুখোমুখি হতে পারে, গ্রাফকিউএল সাধারণত অন্যান্য অংশের সঠিক ফলাফলটি ফেরত দেয়।
Error Object Structure
গ্রাফকিউএল এর ত্রুটি সাধারণত নিচের মতো স্ট্রাকচার থাকে:
{
"data": null,
"errors": [
{
"message": "User not found",
"path": ["getUser"],
"locations": [{ "line": 3, "column": 5 }],
"extensions": {
"code": "USER_NOT_FOUND"
}
}
]
}
এখানে:
- message: ত্রুটির বর্ণনা বা বার্তা।
- path: কুয়েরির কোন অংশে ত্রুটি হয়েছে তা দেখায় (যেমন, কোন ফিল্ড বা সাব-ফিল্ড)।
- locations: ত্রুটির অবস্থান, যেমন কুয়েরির কোন লাইনে ত্রুটি ঘটেছে।
- extensions: অতিরিক্ত তথ্য, যেমন কাস্টম ত্রুটি কোড, যা ব্যবহার করে আপনি ত্রুটির ধরন চিহ্নিত করতে পারেন।
গ্রাফকিউএল ত্রুটি ব্যবস্থাপনা
১. সাধারণ ত্রুটি রিটার্ন
গ্রাফকিউএল একটি ত্রুটি সাধারণত throw কমান্ড দিয়ে রেজোলভার বা ফাংশনে ফেরত পাঠানো হয়। উদাহরণস্বরূপ, যদি ব্যবহারকারী একটি অবৈধ আইডি প্রদান করে:
const resolvers = {
Query: {
getUser: async (parent, { id }) => {
const user = await User.findById(id);
if (!user) {
throw new Error("User not found"); // Trow error if user not found
}
return user;
}
}
};
এখানে:
- যদি
User.findById(id)কোনো ব্যবহারকারী খুঁজে না পায়, তাহলেErrorতৈরি করা হয় এবং তা ফেরত পাঠানো হয়।
২. কাস্টম ত্রুটি বার্তা (Custom Error Messages)
কাস্টম ত্রুটি কোড এবং বার্তা ব্যবহার করে, আপনি গ্রাফকিউএল ত্রুটিগুলির আরও বিস্তারিত এবং উপযোগী তথ্য সরবরাহ করতে পারেন। উদাহরণস্বরূপ, আপনি একটি কাস্টম ত্রুটি কোড তৈরি করতে পারেন:
class UserNotFoundError extends Error {
constructor(message) {
super(message);
this.name = "UserNotFoundError";
this.extensions = {
code: "USER_NOT_FOUND",
status: 404
};
}
}
const resolvers = {
Query: {
getUser: async (parent, { id }) => {
const user = await User.findById(id);
if (!user) {
throw new UserNotFoundError("User not found");
}
return user;
}
}
};
এখানে, UserNotFoundError কাস্টম ত্রুটি ব্যবহার করা হয়েছে যাতে extensions ফিল্ডে code এবং status দেয়া হয়েছে, যা ত্রুটির ধরন এবং স্ট্যাটাস কোড জানাতে সাহায্য করবে।
৩. Error Handling with Apollo Server
যখন আপনি Apollo Server ব্যবহার করছেন, ত্রুটিগুলি সাধারণত extensions ফিল্ডে কাস্টম কোডসহ ফেরত আসে। উদাহরণস্বরূপ:
const { ApolloServer, gql } = require('apollo-server');
const { UserNotFoundError } = require('./errors'); // Custom Error
const typeDefs = gql`
type User {
id: ID!
name: String!
email: String!
}
type Query {
getUser(id: ID!): User
}
`;
const resolvers = {
Query: {
getUser: async (parent, { id }) => {
const user = await User.findById(id);
if (!user) {
throw new UserNotFoundError("User not found"); // Throw custom error
}
return user;
}
}
};
// Apollo Server Setup
const server = new ApolloServer({
typeDefs,
resolvers,
formatError: (error) => {
// Custom error formatting
return {
message: error.message,
extensions: {
code: error.extensions.code,
status: error.extensions.status
}
};
}
});
server.listen().then(({ url }) => {
console.log(`Server ready at ${url}`);
});
এখানে:
formatErrorফাংশন ব্যবহার করে, ত্রুটির রূপ পরিবর্তন করা হচ্ছে এবং কাস্টমextensionsফিল্ড প্রদান করা হচ্ছে।
গ্রাফকিউএল ত্রুটির শ্রেণীবিভাগ
গ্রাফকিউএল ত্রুটির কিছু সাধারণ শ্রেণী বা কোড থাকতে পারে, যেমন:
- Validation Errors: কুয়েরি বা মিউটেশন যদি সঠিক ফর্ম্যাটে না থাকে, তবে সেগুলি ত্রুটি হিসেবে গণ্য হয়।
- উদাহরণ: "Invalid syntax", "Field not found", "Missing required argument"
- Execution Errors: যখন কুয়েরির রেজোলভার বা সার্ভার কোনো ত্রুটি তৈরি করে, তখন Execution errors ঘটে।
- উদাহরণ: "Database connection failed", "User not found"
- Authorization Errors: যখন ক্লায়েন্ট অনুমতি ছাড়া সুরক্ষিত রিসোর্স অ্যাক্সেস করার চেষ্টা করে, তখন Authorization errors ঘটে।
- উদাহরণ: "Not authorized", "Access denied"
- Network Errors: সার্ভার বা নেটওয়ার্ক সম্পর্কিত ত্রুটি।
- উদাহরণ: "Request timeout", "Network failure"
GraphQL-এ Triage বা Retry Error
আপনি retry logic প্রয়োগ করতে পারেন ত্রুটি হ্যান্ডলিংয়ের অংশ হিসেবে। এটি ত্রুটি ঘটলে স্বয়ংক্রিয়ভাবে পুনরায় চেষ্টা করতে সহায়ক। উদাহরণস্বরূপ, ডেটাবেসের সাথে সংযোগের সমস্যা হলে, আপনি একটি retry mechanism তৈরি করতে পারেন:
const fetchUser = async (id) => {
let attempts = 0;
while (attempts < 3) {
try {
const user = await User.findById(id);
return user;
} catch (error) {
attempts++;
if (attempts >= 3) throw new Error('Failed to fetch user after 3 attempts');
}
}
};
এখানে, retry logic ত্রুটি ঘটলে ৩টি পর্যন্ত পুনরায় চেষ্টা করবে এবং এরপর Error ছুড়ে ফেলবে।
সারাংশ
Error Handling গ্রাফকিউএল অ্যাপ্লিকেশনগুলির জন্য গুরুত্বপূর্ণ একটি অংশ। আপনি কাস্টম ত্রুটি বার্তা, কোড এবং extensions ব্যবহার করে ত্রুটি সম্পর্কে আরও বিস্তারিত তথ্য সরবরাহ করতে পারেন। গ্রাফকিউএল ত্রুটির প্রতিটি অংশকে স্ট্রাকচারড এবং নির্দিষ্টভাবে হ্যান্ডেল করা হয়, যা ডেভেলপারদের দ্রুত ডিবাগ এবং সমাধান করতে সাহায্য করে। Apollo Server এর মাধ্যমে, আপনি কাস্টম ত্রুটি ফরম্যাটিং এবং রেজলভারের মাধ্যমে ত্রুটি পরিচালনা করতে পারেন।
গ্রাফকিউএল (GraphQL)-এ Error Handling খুবই গুরুত্বপূর্ণ, কারণ এটি ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা ট্রান্সফার করার সময় অনেক ধরনের সমস্যা বা ত্রুটি তৈরি করতে পারে। গ্রাফকিউএল নিজেই কিছু বিল্ট-ইন error handling ফিচার প্রদান করে, যা ডেভেলপারদের ত্রুটিগুলিকে পরিচালনা করতে সাহায্য করে এবং কুয়েরি বা মিউটেশন সফলভাবে সম্পাদন না হলে যথাযথ ত্রুটি বার্তা প্রদান করে।
GraphQL এ Error Handling এর মৌলিক ধারণা
গ্রাফকিউএল এ ত্রুটির (error) ধারণাটি সাধারণত Execution Errors এবং Syntax Errors এর মধ্যে ভাগ করা হয়।
- Syntax Errors:
যখন গ্রাফকিউএল কুয়েরি সঠিকভাবে লিখিত না হয় এবং কুয়েরির স্ট্রাকচার বা সিঙ্কট্যাক্স ভুল থাকে, তখন এটি একটি সিঙ্কট্যাক্স ত্রুটি (Syntax Error) তৈরি করবে। - Execution Errors:
যখন কুয়েরি সঠিকভাবে গ্রাফকিউএল সার্ভারে প্রসেস হয়, তবে ডেটার অ্যাক্সেস বা ম্যানিপুলেশনের সময় কোনও সমস্যা ঘটে (যেমন ডেটাবেসে অ্যাক্সেস সমস্যা বা অনুমতির অভাব), তখন এটি Execution Error সৃষ্টি করে।
গ্রাফকিউএল ত্রুটি (Error) কিভাবে পরিচালিত হয়?
গ্রাফকিউএল এর বিল্ট-ইন error handling সাধারণত কুয়েরি বা মিউটেশনের ফলস্বরূপ errors ফিল্ডে ত্রুটির বিস্তারিত প্রদান করে। এই ত্রুটির তথ্য সাধারণত একটি array আকারে আসে, যার মধ্যে প্রতিটি ত্রুটি একটি অবজেক্ট হিসেবে থাকে। ত্রুটির অবজেক্টে বেশ কিছু তথ্য থাকতে পারে, যেমন:
- message: ত্রুটির বিবরণ
- locations: কুয়েরির কোন অংশে ত্রুটি হয়েছে
- path: কোথায় ত্রুটির সূত্রপাত
- extensions: অতিরিক্ত কাস্টম ত্রুটি ডেটা
Error Response Structure
যখন কোনো ত্রুটি ঘটে, গ্রাফকিউএল সাধারণত নিম্নলিখিত ফর্ম্যাটে একটি ত্রুটি রেসপন্স প্রদান করে:
{
"data": null,
"errors": [
{
"message": "User not found",
"locations": [
{
"line": 2,
"column": 5
}
],
"path": [
"user"
]
}
]
}
এখানে:
- data: যদি কুয়েরি বা মিউটেশন কোনোভাবে আংশিকভাবে সম্পন্ন হয়, তবে কিছু ডেটা ফেরত আসতে পারে। ত্রুটির কারণে data ফিল্ড
nullথাকতে পারে। - errors: এটি একটি array, যেখানে ত্রুটির বিশদ বিবরণ দেওয়া থাকে।
গ্রাফকিউএল ত্রুটি ব্যবস্থাপনার জন্য বিল্ট-ইন বৈশিষ্ট্য
গ্রাফকিউএল-এ ত্রুটি ব্যবস্থাপনার জন্য কিছু বিল্ট-ইন বৈশিষ্ট্য রয়েছে:
1. Error Propagation
গ্রাফকিউএল স্বয়ংক্রিয়ভাবে ত্রুটি সনাক্ত করে এবং কুয়েরির ফলস্বরূপ সেগুলি প্রপাগেট করে। অর্থাৎ, যদি একটি ফিল্ডে ত্রুটি ঘটে, তবে পুরো কুয়েরি বা মিউটেশন ব্যর্থ হতে পারে, তবে অন্য সঠিকভাবে চলমান ফিল্ডগুলি থেকে ডেটা ফিরিয়ে আনা হতে পারে।
query {
user(id: "1") {
name
email
}
post(id: "1") {
title
content
}
}
এখানে:
- যদি user কুয়েরি ত্রুটিপূর্ণ হয়, তবে গ্রাফকিউএল কেবল post কুয়েরির ফলাফল ফিরিয়ে দিতে পারে এবং ত্রুটির তথ্য errors ফিল্ডে প্রদান করবে।
2. Custom Error Extensions
গ্রাফকিউএল ত্রুটির ক্ষেত্রে extensions নামে একটি অতিরিক্ত ফিল্ড অন্তর্ভুক্ত করা সম্ভব, যেখানে আপনি ত্রুটির সম্পর্কে আরও বিস্তারিত বা কাস্টম ডেটা প্রদান করতে পারেন।
const { ApolloError } = require('apollo-server');
const resolvers = {
Query: {
user: async (_, { id }) => {
const user = await findUserById(id);
if (!user) {
throw new ApolloError('User not found', 'USER_NOT_FOUND', {
userId: id,
});
}
return user;
},
},
};
এখানে:
- ApolloError ব্যবহার করা হয়েছে কাস্টম ত্রুটি তৈরি করার জন্য, এবং তাতে extensions এর মাধ্যমে অতিরিক্ত ডেটা (যেমন
userId) পাঠানো হচ্ছে।
3. Error Formatting (Custom Error Handling)
আপনার সার্ভারে গ্রাফকিউএল ত্রুটির আচরণ কাস্টমাইজ করা সম্ভব। আপনি কাস্টম ত্রুটি বার্তা এবং কাস্টম ত্রুটি রেসপন্স প্রদান করতে পারেন, যাতে ক্লায়েন্টদের ত্রুটি বুঝতে সুবিধা হয়।
const { ApolloServer, gql } = require('apollo-server');
const { GraphQLError } = require('graphql');
const typeDefs = gql`
type Query {
hello: String
}
`;
const resolvers = {
Query: {
hello: () => {
throw new GraphQLError('Custom error message', {
extensions: {
code: 'BAD_USER_INPUT',
message: 'Something went wrong',
},
});
},
},
};
const server = new ApolloServer({ typeDefs, resolvers });
server.listen().then(({ url }) => {
console.log(`Server ready at ${url}`);
});
এখানে:
- GraphQLError-এ কাস্টম extensions যোগ করা হয়েছে, যা ত্রুটির কোড এবং বার্তা সহ আরও বিস্তারিত তথ্য প্রদান করে।
4. Partial Errors Handling
গ্রাফকিউএল ত্রুটি বার্তাগুলি partial errors কে হ্যান্ডল করতে সহায়ক। উদাহরণস্বরূপ, একটি কুয়েরির কিছু অংশ সফল হতে পারে, তবে অন্য অংশে ত্রুটি ঘটতে পারে। গ্রাফকিউএল এই ত্রুটিগুলি errors ফিল্ডে প্রদান করে, এবং ডেটা যদি কিছু অংশে পাওয়া যায়, তবে তা data ফিল্ডে ফেরত দেয়।
{
"data": {
"user": {
"name": "John Doe"
}
},
"errors": [
{
"message": "Failed to fetch user email",
"locations": [{ "line": 2, "column": 5 }],
"path": ["user", "email"]
}
]
}
এখানে:
- ইউজারের নাম data ফিল্ডে পাওয়া গেছে, কিন্তু ইমেইল অ্যাক্সেস করতে গিয়ে ত্রুটি ঘটেছে এবং সেই ত্রুটির বিস্তারিত errors ফিল্ডে রয়েছে।
5. Validation Errors
যখন আপনি ইনপুট যাচাই করতে চান (যেমন ইউজার নাম, পাসওয়ার্ড, বা কোনো প্যারামিটার), আপনি GraphQL Scalars অথবা কাস্টম validators ব্যবহার করতে পারেন, যা ত্রুটি তৈরি করবে যদি ইনপুট সঠিক না হয়।
const { GraphQLScalarType, Kind } = require('graphql');
const EmailType = new GraphQLScalarType({
name: 'Email',
description: 'A custom scalar type for email',
serialize(value) {
if (!/\S+@\S+\.\S+/.test(value)) {
throw new Error('Invalid email format');
}
return value;
},
});
এখানে:
- আপনি একটি কাস্টম scalar তৈরি করে ইনপুট যাচাই করতে পারেন, যেমন Email টাইপ, যা সঠিক ফরম্যাটে না থাকলে ত্রুটি সৃষ্টি করবে।
সারাংশ
গ্রাফকিউএল বিল্ট-ইন error handling সিস্টেমের মাধ্যমে ত্রুটির সঠিক ব্যবস্থাপনা এবং কুয়েরি বা মিউটেশনের সঠিক ফলাফল প্রদান নিশ্চিত করে। গ্রাফকিউএল ত্রুটির জন্য কিছু মূল বৈশিষ্ট্য রয়েছে, যেমন error propagation, custom error extensions, partial errors, এবং validation errors। এছাড়াও, আপনি কাস্টম error handling লজিক তৈরি করতে পারেন, যা আপনার অ্যাপ্লিকেশনকে আরও নিরাপদ এবং ব্যবহারকারীদের জন্য আরও সহায়ক করে তোলে।
গ্রাফকিউএল (GraphQL) অ্যাপ্লিকেশনে Custom Error Messages এবং Exceptions ব্যবস্থাপনা খুবই গুরুত্বপূর্ণ। এটি ডেভেলপারদের ইউজারের জন্য আরো নির্দিষ্ট এবং স্পষ্ট ত্রুটি বার্তা প্রদান করতে সাহায্য করে এবং এক্সেপশন হ্যান্ডলিং প্রক্রিয়াকে উন্নত করে। সাধারণত, গ্রাফকিউএল টুলস আপনাকে error এবং exception হ্যান্ডলিংয়ের জন্য মৌলিক পদ্ধতি দেয়, তবে আপনি custom error messages তৈরি করতে পারেন যা কাস্টমাইজড এবং আরও উপযোগী।
গ্রাফকিউএল সাধারণত Apollo Server বা অন্যান্য গ্রাফকিউএল সার্ভার লাইব্রেরি ব্যবহার করে কাজ করে, যেখানে এক্সেপশন হ্যান্ডলিংয়ের জন্য ডিফল্ট মেকানিজম আছে, কিন্তু আপনি তা কাস্টমাইজ করতে পারেন।
Custom Error Messages তৈরি করা
Custom Error Messages তৈরি করতে, প্রথমে আপনাকে গ্রাফকিউএল কুয়েরির মধ্যে কোনো ত্রুটি ঘটলে তা সঠিকভাবে ধরা এবং পাঠানোর জন্য কাস্টম এক্সেপশন তৈরি করতে হবে।
Error Class তৈরি করা
আপনি একটি কাস্টম Error class তৈরি করতে পারেন যা ব্যবহারকারীর জন্য আরও স্পষ্ট এবং অর্থপূর্ণ ত্রুটি বার্তা পাঠাবে।
class CustomError extends Error {
constructor(message, code = 400, details = null) {
super(message);
this.code = code;
this.details = details;
this.name = this.constructor.name;
}
}
এখানে:
message: ত্রুটির বার্তা যা ব্যবহারকারীকে দেখানো হবে।code: HTTP স্ট্যাটাস কোড, যেমন 400 (Bad Request), 401 (Unauthorized), 500 (Internal Server Error) ইত্যাদি।details: অতিরিক্ত বিস্তারিত তথ্য, যদি প্রয়োজন হয়, যেমন ত্রুটির কারণ বা ঠিক কী ভুল হয়েছে।
কাস্টম ত্রুটি ব্যবহার করা
এখন, আপনি এই কাস্টম Error ক্লাসটি ব্যবহার করতে পারেন গ্রাফকিউএল রেজোলভারে কাস্টম ত্রুটি তৈরি করার জন্য। যেমন:
const { ApolloError } = require('apollo-server');
// Custom Error using ApolloError
const resolvers = {
Query: {
getUser: (parent, args, context) => {
if (!args.id) {
throw new ApolloError('User ID is required', 'USER_ID_MISSING');
}
const user = getUserFromDatabase(args.id); // Assume this function checks the DB
if (!user) {
throw new ApolloError('User not found', 'USER_NOT_FOUND');
}
return user;
}
}
};
এখানে:
ApolloError: Apollo Server এর একটি বিল্ট-ইন ক্লাস যা কাস্টম ত্রুটি তৈরি করতে সাহায্য করে। এতে আপনি message এবং code সেট করতে পারেন।USER_ID_MISSINGএবংUSER_NOT_FOUND: কাস্টম ত্রুটি কোড, যা গ্রাফকিউএল রেসপন্সে ত্রুটির ধরন চিহ্নিত করে।
Custom Error Message Format
এখন, কাস্টম ত্রুটির বার্তা কিভাবে ফরম্যাট হবে তা দেখতে হবে। Apollo Server স্বয়ংক্রিয়ভাবে message, code, এবং অন্যান্য ত্রুটি সম্পর্কিত তথ্য গ্রাফকিউএল রেসপন্সে যুক্ত করবে।
Response Example:
{
"errors": [
{
"message": "User not found",
"extensions": {
"code": "USER_NOT_FOUND",
"exception": {
"stacktrace": [...]
}
}
}
]
}
এখানে, আপনি ত্রুটির বার্তা এবং এর কোড দেখতে পাবেন, এবং এই তথ্যটি আপনি API-তে ফেরত দিতে পারবেন।
Exception Handling in GraphQL
গ্রাফকিউএল কুয়েরি বা মিউটেশনে যে কোন সমস্যা ঘটলে, আপনি সাধারণত try-catch ব্লক ব্যবহার করে এক্সেপশন হ্যান্ডলিং করতে পারেন।
try-catch ব্লক ব্যবহার করা
const resolvers = {
Query: {
getUser: async (parent, args, context) => {
try {
if (!args.id) {
throw new CustomError('User ID is required');
}
const user = await getUserFromDatabase(args.id);
if (!user) {
throw new CustomError('User not found', 404);
}
return user;
} catch (error) {
// Custom Error handling
if (error instanceof CustomError) {
throw new ApolloError(error.message, error.code, { details: error.details });
}
throw new ApolloError('Internal Server Error', 'INTERNAL_SERVER_ERROR');
}
}
}
};
এখানে:
- try-catch ব্লকটি ব্যবহার করে আপনি ত্রুটিগুলি ধরছেন এবং কাস্টম ApolloError তৈরি করছেন।
- CustomError ইন্সট্যান্স চেক করে, কাস্টম বার্তা এবং কোড প্রেরণ করা হচ্ছে, অন্যথায় ডিফল্ট "Internal Server Error" বার্তা পাঠানো হচ্ছে।
কাস্টম এক্সেপশন ধরা
আপনি যেকোনো কাস্টম এক্সেপশন তৈরি করতে পারেন, যেমন একটি DatabaseError যা ডেটাবেস সংক্রান্ত ত্রুটির জন্য ব্যবহৃত হতে পারে:
class DatabaseError extends ApolloError {
constructor(message, code = 'DATABASE_ERROR') {
super(message, code);
this.name = 'DatabaseError';
}
}
এটি ApolloError এর একটি এক্সটেনশন হতে পারে, যা ডেটাবেস সংক্রান্ত সমস্যাগুলির জন্য কাস্টম এক্সেপশন তৈরি করতে ব্যবহৃত হবে।
Best Practices for GraphQL Error Handling
- Error Codes: নিশ্চিত করুন যে আপনি কাস্টম ত্রুটির জন্য একটি নির্দিষ্ট কোড ব্যবহার করছেন, যাতে ক্লায়েন্টের জন্য ত্রুটির ধরন চিহ্নিত করা সহজ হয়। যেমন
USER_NOT_FOUND,INVALID_INPUT,INTERNAL_SERVER_ERRORইত্যাদি। - Error Extensions:
extensionsঅংশে অতিরিক্ত ত্রুটি তথ্য রাখতে পারেন, যেমন সঠিক ত্রুটি কোড এবং স্ট্যাকট্রেস। তবে, প্রোডাকশনে স্ট্যাকট্রেস কখনো প্রকাশ করবেন না। - Descriptive Messages: ত্রুটি বার্তাগুলিকে বোধগম্য এবং পরিষ্কার রাখুন। ভেরি সুনির্দিষ্ট বার্তা যেমন
User with the provided ID does not existআরো সহায়ক। - Custom Error Classes: আপনি যদি একাধিক প্রকারের ত্রুটি হ্যান্ডেল করতে চান, তবে Custom Error Classes তৈরি করুন। যেমন, DatabaseError, ValidationError ইত্যাদি।
- ApolloError ব্যবহার করা: গ্রাফকিউএল API-তে ApolloError ক্লাস ব্যবহারের মাধ্যমে ত্রুটি পরিচালনা সহজ করা যায়, বিশেষত যখন আপনি GraphQL API-তে কাস্টম কোড এবং বার্তা চান।
- Log Errors: প্রতিটি ত্রুটির ক্ষেত্রে লগ রাখা খুবই গুরুত্বপূর্ণ, বিশেষত যখন ডিবাগিং বা ট্রাবলশুটিং করতে হয়।
সারাংশ
গ্রাফকিউএল ত্রুটি পরিচালনা এবং কাস্টম এক্সেপশন তৈরি করার জন্য অনেক নমনীয়তা প্রদান করে। আপনি CustomError ক্লাস এবং try-catch ব্লক ব্যবহার করে স্পষ্ট এবং উপযোগী ত্রুটি বার্তা তৈরি করতে পারেন। ApolloError ব্যবহার করা এবং কাস্টম ত্রুটির কোড, বার্তা ও অন্যান্য তথ্য extensions-এ প্রদান করা গ্রাফকিউএল API ডেভেলপমেন্টে ভাল অভ্যাস।
গ্রাফকিউএল (GraphQL) এ Validation Errors এবং Field Level Error Handling হল একটি গুরুত্বপূর্ণ দিক যা API-এর সঠিক ব্যবহার নিশ্চিত করতে সহায়ক। গ্রাফকিউএল কুয়েরি বা মিউটেশন যখন কিছু ভুল বা অযাচিত ইনপুট পায়, তখন ব্যবহারকারীদের সঠিকভাবে ভুল বার্তা প্রদান করা উচিত। গ্রাফকিউএল এ Error Handling এর সঠিক প্রক্রিয়া শুধুমাত্র ব্যবহারকারীর জন্য ভালো অভিজ্ঞতা তৈরি করে না, বরং সার্ভারের জন্যও কার্যকারিতা নিশ্চিত করে।
Validation Errors কী?
Validation Errors হলো এমন ত্রুটি যা occurs যখন একটি ইনপুট কুয়েরি বা মিউটেশন কোনো নির্দিষ্ট নিয়ম বা শর্ত পূর্ণ করে না। উদাহরণস্বরূপ, একটি ফিল্ড যদি required হয় এবং সেই ফিল্ডটি কুয়েরিতে না দেয়া হয়, অথবা কোনো ফিল্ড যদি ভুল ধরনের ডেটা পায় (যেমন স্ট্রিং এর পরিবর্তে নম্বর), তবে গ্রাফকিউএল সেই কুয়েরি বা মিউটেশনকে গ্রহণ করবে না এবং একটি Validation Error প্রদান করবে।
গ্রাফকিউএলে Validation Error Handling:
- Input Type Validation:
- গ্রাফকিউএল স্কিমায় ইনপুট টাইপ নির্ধারণ করা হয়, এবং গ্রাফকিউএল নিজে থেকেই টাইপের সঠিকতা পরীক্ষা করে। যেমন একটি স্ট্রিং ফিল্ডে যদি আপনি একটি নম্বর প্রদান করেন, তাহলে তা একটি Validation Error সৃষ্টি করবে।
type Query {
getUser(id: ID!): User
}
এখানে id ফিল্ডের জন্য ID! টাইপ নির্ধারণ করা হয়েছে, যা মানে এই ফিল্ডটি কখনই null হতে পারে না। যদি কুয়েরিতে আপনি একটি null বা ভুল টাইপের ভ্যালু পাঠান, তাহলে এটি একটি validation error তৈরি করবে।
- Required Fields:
- যদি একটি ফিল্ড
!চিহ্ন দ্বারা বাধ্যতামূলক (required) হিসাবে চিহ্নিত হয় এবং আপনি কুয়েরিতে ঐ ফিল্ডের মান প্রদান না করেন, তাহলে গ্রাফকিউএল একটি validation error দিবে।
- যদি একটি ফিল্ড
type Mutation {
createUser(name: String!, email: String!): User
}
এখানে, name এবং email ফিল্ড দুটি ! চিহ্নিত, যা মানে তাদের মান অবশ্যই প্রদান করতে হবে। যদি আপনি মিউটেশনে এই ফিল্ডগুলোর মান না পাঠান, তাহলে validation error হবে।
Field Level Error Handling
Field Level Error Handling হল যখন একটি নির্দিষ্ট ফিল্ডের জন্য ত্রুটি পরিচালনা করা হয়, যাতে আপনি কুয়েরির শুধু সেই ফিল্ডটিতে ত্রুটি নির্দেশ করতে পারেন, তবে পুরো কুয়েরি বা মিউটেশন নয়। এটি ব্যবহারকারীর অভিজ্ঞতা উন্নত করে, কারণ তারা জানবে যে কোন ফিল্ডে সমস্যা হচ্ছে এবং সঠিকভাবে সমস্যা সমাধান করতে পারবে।
Field Level Error Handling Example:
ধরা যাক, আপনি একটি createUser মিউটেশন তৈরি করেছেন যেখানে name এবং email ফিল্ড আছে। যদি name ফিল্ডটি 3 অক্ষরের কম হয়, তবে আপনি একটি ত্রুটি বার্তা প্রেরণ করতে চান, কিন্তু বাকি ফিল্ডগুলোতে কিছু ভুল থাকলে পুরো কুয়েরি ব্যর্থ না হয়ে শুধুমাত্র সংশ্লিষ্ট ফিল্ডে ত্রুটি দেখাবে।
type Mutation {
createUser(name: String!, email: String!): User
}
type User {
id: ID!
name: String!
email: String!
}
এখানে, যদি name ফিল্ডের মান কমপক্ষে 3 অক্ষর না হয়, তবে আপনি কেবল ওই ফিল্ডের জন্য একটি ত্রুটি তৈরি করতে পারেন। এর জন্য GraphQL resolvers এ error handling যুক্ত করা যেতে পারে।
const resolvers = {
Mutation: {
createUser: async (_, { name, email }) => {
if (name.length < 3) {
throw new Error("Name must be at least 3 characters long.");
}
// user creation logic here
return {
id: "1",
name: name,
email: email
};
},
},
};
এখানে:
- যদি name ফিল্ডের দৈর্ঘ্য 3 এর কম হয়, তবে এটি Field Level Error হিসাবে ধরা হবে এবং নির্দিষ্ট ত্রুটি বার্তা প্রদর্শিত হবে।
- ত্রুটি অন্য কোন ফিল্ডের জন্য হবে না।
Field Level Error Example Response:
{
"errors": [
{
"message": "Name must be at least 3 characters long.",
"path": ["createUser", "name"]
}
],
"data": null
}
এখানে:
pathফিল্ডে ত্রুটির সঠিক অবস্থান উল্লেখ করা হয়েছে, যা এই ক্ষেত্রেcreateUser.name।dataহলnull, কারণ মিউটেশন ব্যর্থ হয়েছে, কিন্তু অন্য ফিল্ডগুলো email ঠিক ছিল।
Error Types in GraphQL
গ্রাফকিউএল ত্রুটির জন্য বিভিন্ন ধরনের শ্রেণীবিভাগ ব্যবহার করে। এখানে কিছু সাধারণ error types:
- Validation Errors: যখন ইনপুট টাইপ বা required ফিল্ডে ভুল হয়, তখন এটি validation error হয়।
- Execution Errors: যখন কোনো রেজোলভার বা সার্ভার সাইড সমস্যার কারণে কুয়েরি বা মিউটেশন এক্সিকিউট করা সম্ভব হয় না।
- Authentication/Authorization Errors: যখন ব্যবহারকারীর অনুমতি বা প্রমাণীকরণ ব্যর্থ হয়, তখন এই ধরনের ত্রুটি আসে।
সারাংশ
Validation Errors এবং Field Level Error Handling গ্রাফকিউএল API-তে নিরাপত্তা এবং সঠিক ডেটা প্রবাহ নিশ্চিত করার জন্য অত্যন্ত গুরুত্বপূর্ণ। Validation Errors ইনপুটের সঠিকতা পরীক্ষা করে এবং ব্যবহারকারীর ভুল কমাতে সহায়ক, আবার Field Level Error Handling নির্দিষ্ট ফিল্ডে ত্রুটি নির্দেশ করে এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত করে। গ্রাফকিউএল কুয়েরি বা মিউটেশন রেজোলভারসে ত্রুটি পরিচালনা সঠিকভাবে বাস্তবায়িত করা উচিত, যাতে ব্যবহারকারীরা সহজে তাদের সমস্যাগুলি শনাক্ত করতে পারে এবং দ্রুত সমাধান করতে সক্ষম হয়।
গ্রাফকিউএল (GraphQL)-এ Global Error Handler কনফিগার করা একটি গুরুত্বপূর্ণ পদক্ষেপ, যা অ্যাপ্লিকেশনের সেন্ট্রালাইজড স্থান থেকে সমস্ত ত্রুটি (errors) পরিচালনা করতে সহায়ক। এটি আপনাকে আপনার API-তে একক স্থানে ত্রুটি পরিচালনা করতে, ত্রুটির তথ্য কাস্টমাইজ করতে এবং এগুলিকে ব্যবহারকারীর কাছে আরও পরিষ্কার এবং অর্থপূর্ণভাবে উপস্থাপন করতে সহায়ক। গ্রাফকিউএল সার্ভারে সেন্ট্রালাইজড ত্রুটি ব্যবস্থাপনা সেটআপ করতে Apollo Server বা অন্যান্য গ্রাফকিউএল সার্ভারগুলি ব্যবহার করা হয়।
গ্রাফকিউএল Error Handling এর গুরুত্ব
ত্রুটির সঠিক ব্যবস্থাপনা অ্যাপ্লিকেশনকে আরও ব্যবহারযোগ্য এবং নির্ভরযোগ্য করে তোলে। সঠিক ত্রুটি পরিচালনা:
- ত্রুটির উৎস চিহ্নিত করতে সাহায্য করে।
- উন্নত ডিবাগিং এবং লগিং সুবিধা প্রদান করে।
- ব্যবহারকারীদের স্পষ্ট এবং সহায়ক ত্রুটি বার্তা সরবরাহ করে।
- নিরাপত্তা উন্নত করে (যাতে আপনি সঠিক ত্রুটির বার্তা প্রদান করতে পারেন কিন্তু সিস্টেমের অন্তর্নিহিত ত্রুটি লুকিয়ে রাখতে পারেন)।
Apollo Server-এ Global Error Handler কনফিগার করা
Apollo Server-এ গ্রাফকিউএল এর ত্রুটি হ্যান্ডলিং করার জন্য, আমরা formatError ফাংশন ব্যবহার করতে পারি যা গ্রাফকিউএল সার্ভারে সারা পৃথিবীজুড়ে সমস্ত ত্রুটি ক্যাচ করে। formatError ফাংশনটি সমস্ত ত্রুটির উপস্থাপনাকে কাস্টমাইজ করতে সাহায্য করে এবং ক্লায়েন্টকে নির্দিষ্ট ত্রুটি বার্তা এবং কোড পাঠাতে সক্ষম হয়।
formatError এর মাধ্যমে Global Error Handler কনফিগার করা
এখানে Apollo Server ব্যবহার করে একটি Global Error Handler কনফিগার করার উদাহরণ দেওয়া হলো:
const { ApolloServer, gql } = require('apollo-server');
// গ্রাফকিউএল স্কিমা
const typeDefs = gql`
type Query {
hello: String
errorTest: String
}
`;
// রেজোলভার
const resolvers = {
Query: {
hello: () => "Hello, world!",
errorTest: () => {
throw new Error("This is a test error!");
}
}
};
// Apollo Server কনফিগারেশন
const server = new ApolloServer({
typeDefs,
resolvers,
formatError: (err) => {
// কাস্টম ত্রুটি বার্তা এবং স্ট্যাটাস কোড
const errorMessage = err.message || 'An unexpected error occurred';
const errorPath = err.path ? err.path.join(' -> ') : '';
// কাস্টম ত্রুটি ফর্ম্যাট
return {
message: errorMessage,
path: errorPath,
locations: err.locations,
extensions: {
code: 'INTERNAL_SERVER_ERROR', // কাস্টম ত্রুটি কোড
timestamp: new Date().toISOString()
}
};
}
});
// সার্ভার চালানো
server.listen().then(({ url }) => {
console.log(`Server ready at ${url}`);
});
কোড ব্যাখ্যা:
formatError: এই ফাংশনটি সব ধরনের ত্রুটির জন্য কার্যকর হবে। এখানে আপনি ত্রুটি বার্তা, অবস্থান এবং কাস্টম ফরম্যাট কনফিগার করতে পারবেন।message: এখানে ত্রুটির মূল বার্তা কাস্টমাইজ করা হচ্ছে।path: ত্রুটির যেখান থেকে এসেছে তার পথ এখানে কাস্টমাইজ করা হয়েছে।extensions: এখানে ত্রুটির জন্য অতিরিক্ত কাস্টম ডেটা যেমন ত্রুটি কোড এবং টাইমস্ট্যাম্প যোগ করা হয়েছে।
এটি নিশ্চিত করে যে, গ্রাফকিউএল API-তে সমস্ত ত্রুটির জন্য একটি একক কাঠামো থাকবে, যা ক্লায়েন্টের কাছে স্পষ্ট এবং কাস্টমাইজড বার্তা পাঠাবে।
ব্যক্তিগত ত্রুটি কোড তৈরি করা
গ্রাফকিউএল সার্ভারে কাস্টম ত্রুটি কোড তৈরি করা অত্যন্ত গুরুত্বপূর্ণ, বিশেষত যখন আপনি API তে বিশেষ ধরনের ত্রুটি ইঙ্গিত করতে চান (যেমন, VALIDATION_ERROR, AUTHORIZATION_ERROR, ইত্যাদি)।
const server = new ApolloServer({
typeDefs,
resolvers,
formatError: (err) => {
if (err.message.includes('validation')) {
return {
message: "Invalid input provided",
extensions: {
code: 'VALIDATION_ERROR'
}
};
}
return {
message: err.message || 'Unknown error',
extensions: {
code: 'INTERNAL_SERVER_ERROR'
}
};
}
});
এখানে, আপনি ত্রুটির প্রকারের উপর ভিত্তি করে কাস্টম ত্রুটি কোড দিতে পারেন। এটি ক্লায়েন্টকে ত্রুটির ধরন সম্পর্কে আরও পরিষ্কার ধারণা দেয়।
Error Logging
গ্রাফকিউএল সার্ভারে ত্রুটি লগ করার জন্য আপনি কাস্টম logger যুক্ত করতে পারেন, যা সমস্ত ত্রুটির বিস্তারিত লগ রাখবে।
const { ApolloServer } = require('apollo-server');
const logger = require('winston');
const server = new ApolloServer({
typeDefs,
resolvers,
formatError: (err) => {
logger.error(`GraphQL Error: ${err.message}`, {
path: err.path,
locations: err.locations,
timestamp: new Date().toISOString()
});
return err;
}
});
এখানে, winston নামক একটি জনপ্রিয় লগিং লাইব্রেরি ব্যবহার করা হয়েছে। আপনি অন্যান্য লগিং লাইব্রেরি যেমন log4js বা bunyanও ব্যবহার করতে পারেন।
Custom Error Handling in Resolvers
কিছু বিশেষ ক্ষেত্রে, আপনি গ্রাফকিউএল রেজোলভারের মধ্যে কাস্টম ত্রুটি হ্যান্ডলিং করতে চাইতে পারেন। যেমন, কোনো বিশেষ শর্ত পূরণ না হলে একটি নির্দিষ্ট ত্রুটি ফেলে দেওয়া:
const resolvers = {
Query: {
getUser: async (_, { id }) => {
const user = await getUserById(id);
if (!user) {
throw new Error("User not found!");
}
return user;
},
},
};
এখানে, যদি ব্যবহারকারী পাওয়া না যায়, তবে User not found! ত্রুটি উঠবে এবং ক্লায়েন্টকে জানানো হবে।
Error Handling Best Practices
- ডিবাগিং সহায়ক বার্তা: ত্রুটির বার্তা অবশ্যই ডিবাগিংয়ের জন্য সহায়ক হতে হবে। তবে, কখনোই গুরুত্বপূর্ণ সিস্টেমের তথ্য প্রকাশ করবেন না (যেমন স্ট্যাক ট্রেস) যা নিরাপত্তার জন্য ঝুঁকি সৃষ্টি করতে পারে।
- স্পষ্ট ত্রুটি কোড: গ্রাফকিউএল ত্রুটির কোড পরিষ্কার এবং অর্থপূর্ণ হওয়া উচিত, যেমন
AUTHORIZATION_ERROR,VALIDATION_ERROR, ইত্যাদি। - কাস্টম ত্রুটি গঠন: একটি একক ত্রুটি কাঠামো ব্যবহার করুন যাতে সব ত্রুটি একই ফরম্যাটে আসে এবং আপনি সহজেই তাদের শনাক্ত এবং ম্যানেজ করতে পারেন।
সারাংশ
গ্রাফকিউএল সার্ভারে Global Error Handler কনফিগার করা একটি গুরুত্বপূর্ণ পদক্ষেপ, যা আপনার API এর সেন্ট্রালাইজড ত্রুটি পরিচালনার জন্য ব্যবহৃত হয়। Apollo Server এ formatError ব্যবহার করে আপনি ত্রুটির তথ্য কাস্টমাইজ করতে পারেন এবং ত্রুটির ধরন অনুযায়ী উপযুক্ত বার্তা প্রদান করতে পারেন। এছাড়া, কাস্টম ত্রুটি কোড, লগিং, এবং বিশেষ রেজোলভার ত্রুটি হ্যান্ডলিংয়ের মাধ্যমে আপনি একটি সঠিক এবং নিরাপদ ত্রুটি ব্যবস্থাপনা ব্যবস্থা তৈরি করতে পারেন।
Read more