Global Error Handler কনফিগার করা

GraphQL এর মধ্যে Error Handling - গ্রাফকিউএল (GraphQL) - Web Development

233

গ্রাফকিউএল (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

  1. ডিবাগিং সহায়ক বার্তা: ত্রুটির বার্তা অবশ্যই ডিবাগিংয়ের জন্য সহায়ক হতে হবে। তবে, কখনোই গুরুত্বপূর্ণ সিস্টেমের তথ্য প্রকাশ করবেন না (যেমন স্ট্যাক ট্রেস) যা নিরাপত্তার জন্য ঝুঁকি সৃষ্টি করতে পারে।
  2. স্পষ্ট ত্রুটি কোড: গ্রাফকিউএল ত্রুটির কোড পরিষ্কার এবং অর্থপূর্ণ হওয়া উচিত, যেমন AUTHORIZATION_ERROR, VALIDATION_ERROR, ইত্যাদি।
  3. কাস্টম ত্রুটি গঠন: একটি একক ত্রুটি কাঠামো ব্যবহার করুন যাতে সব ত্রুটি একই ফরম্যাটে আসে এবং আপনি সহজেই তাদের শনাক্ত এবং ম্যানেজ করতে পারেন।

সারাংশ

গ্রাফকিউএল সার্ভারে Global Error Handler কনফিগার করা একটি গুরুত্বপূর্ণ পদক্ষেপ, যা আপনার API এর সেন্ট্রালাইজড ত্রুটি পরিচালনার জন্য ব্যবহৃত হয়। Apollo ServerformatError ব্যবহার করে আপনি ত্রুটির তথ্য কাস্টমাইজ করতে পারেন এবং ত্রুটির ধরন অনুযায়ী উপযুক্ত বার্তা প্রদান করতে পারেন। এছাড়া, কাস্টম ত্রুটি কোড, লগিং, এবং বিশেষ রেজোলভার ত্রুটি হ্যান্ডলিংয়ের মাধ্যমে আপনি একটি সঠিক এবং নিরাপদ ত্রুটি ব্যবস্থাপনা ব্যবস্থা তৈরি করতে পারেন।

Content added By
Promotion

Are you sure to start over?

Loading...