বিক্রিয়া রিডেক্সে আনার ত্রুটি মোকাবেলার সেরা উপায় কী?


105

আমার কাছে ক্লায়েন্টের জন্য একটি হ্রাসকারক, অন্যটি অ্যাপটুলবারের জন্য এবং আরও কিছু ...

এখন বলা যাক যে আমি ক্লায়েন্ট মুছতে মুছে ফেলার ব্যবস্থা তৈরি করেছি এবং এটি ব্যর্থ হলে আমার কাছে ক্লায়েন্ট রিডুসারে কোড রয়েছে যা কিছু স্টাফ করা উচিত, তবে আমি অ্যাপটুলবারে কিছু বৈশ্বিক ত্রুটি প্রদর্শন করতে চাই।

তবে ক্লায়েন্ট এবং অ্যাপটুলবার হ্রাসকারীরা রাজ্যের একই অংশটি ভাগ করে না এবং আমি হ্রাসকারীর ক্ষেত্রে নতুন ক্রিয়া তৈরি করতে পারি না।

তাহলে আমি কীভাবে বিশ্বব্যাপী ত্রুটি দেখাব? ধন্যবাদ

আপডেট 1:

আমি উল্লেখ করতে ভুলে গেছি যে আমি এই সর্বনাশা ব্যবহার করি

আপডেট 2: আমি এরিকের উত্তরটিকে সঠিক হিসাবে চিহ্নিত করেছি, তবে আমি বলতে চাই যে আমি যে সমাধানটি ব্যবহার করছি তা এরিক এবং ড্যানের উত্তরের সংমিশ্রণের মতো ... আপনার কোডে আপনার পক্ষে সবচেয়ে উপযুক্ত কিসের সন্ধান করতে হবে .. ।


2
আপনি কাছাকাছি ভোট পাচ্ছেন, এবং সম্ভবত কারণ আপনি পুরো উদাহরণ কোডটি সরবরাহ করছেন না। আপনার প্রশ্ন এবং আপনি যে উত্তরগুলি পেয়েছেন সেগুলি যদি সমস্যার আরও স্পষ্টভাবে বর্ণিত হয় তবে অন্যান্য ব্যক্তির পক্ষে আরও সহায়ক হবে।
আকজাই

আমার ডাব্লু / @ অজয়কে সম্মত করতে হবে যে এই প্রশ্নের প্রেক্ষাপটে অভাব রয়েছে। আমি সাধারণ সমাধান সহ নীচে (কোড উদাহরণ সহ) উত্তর দিয়েছি, তবে আপনার প্রশ্নটি কিছু পরিমার্জন ব্যবহার করতে পারে। দেখে মনে হচ্ছে আপনার কয়েকটি পৃথক সমস্যা থাকতে পারে। 1) async ক্রিয়া / ত্রুটি পরিচালনা করা Hand 2) আপনার রিডেক্স রাজ্যের গাছে যথাযথভাবে রাজ্যকে আলাদা করা। 3) আপনার উপাদানগুলির প্রয়োজনীয় ডেটা প্রাপ্ত করা।
এরিক আইবার

@ এরিক ডেভেলপার ধন্যবাদ, আপনার উত্তরটি দুর্দান্ত দেখাচ্ছে। তবে আপনি ঠিক বলেছেন, আমি প্রসঙ্গটি উল্লেখ করতে ভুলে গেছি। আমি আমার প্রশ্নটি সম্পাদনা করেছি, আমি এটি সর্বনাশ ব্যবহার করছি এবং মনে হচ্ছে আপনার উত্তরটি যেমনটি তেমন প্রয়োগ হয় না ...
দুসান প্লাভক

উত্তর:


116

আপনি যদি "গ্লোবাল ত্রুটি" ধারণাটি পেতে চান তবে আপনি একটি errorsহ্রাসকারী তৈরি করতে পারেন , যা অ্যাডেরর, রিমুভাল এয়ার, ইত্যাদি ... ক্রিয়া শুনতে পাবে listen তারপরে, আপনি এখানে আপনার রেডাক্স রাষ্ট্রের গাছটিতে প্রবেশ করতে পারেনstate.errors এবং উপযুক্ত যেখানে এগুলি প্রদর্শন করতে পারেন।

আপনি এখানে আসতে পারেন এমন অনেকগুলি উপায় রয়েছে তবে সাধারণ ধারণাটি হ'ল বৈশ্বিক ত্রুটি / বার্তাগুলি তাদের নিজস্ব রিডুসারকে <Clients />/ থেকে সম্পূর্ণ আলাদা থাকার যোগ্যতা দেয় <AppToolbar />। অবশ্যই যদি এই উপাদানগুলির যে কোনওটির অ্যাক্সেসের প্রয়োজন হয় তবে যেখানেই প্রয়োজন হবে সেগুলির জন্য প্রপস হিসাবে সেগুলিতে চলে errorsযেতে পারে errors

আপডেট: কোড উদাহরণ

আপনি যদি errorsআপনার শীর্ষ স্তরের "বৈশ্বিক ত্রুটিগুলি" পাস করে <App />শর্তসাপেক্ষে এটি রেন্ডার করতে থাকেন তবে এটি দেখতে কেমন হতে পারে তার একটি উদাহরণ এখানে রয়েছে (যদি কোনও ত্রুটি উপস্থিত থাকে)। কিছু উপাদান আপনার উপাদান হুক আপ করতে রিঅ্যাক্ট-রিডেক্সconnect ব্যবহার <App />করে।

// App.js
// Display "global errors" when they are present
function App({errors}) {
  return (
    <div>
      {errors && 
        <UserErrors errors={errors} />
      }
      <AppToolbar />
      <Clients />
    </div>
  )
}

// Hook up App to be a container (react-redux)
export default connect(
  state => ({
    errors: state.errors,
  })
)(App);

এবং যতক্ষণ অ্যাকশন স্রষ্টার সম্পর্কিত, এটি প্রতিক্রিয়া অনুসারে সাফল্য ব্যর্থতা ( রিডেক্স-থাঙ্ক ) প্রেরণ করবে

export function fetchSomeResources() {
  return dispatch => {
    // Async action is starting...
    dispatch({type: FETCH_RESOURCES});

    someHttpClient.get('/resources')

      // Async action succeeded...
      .then(res => {
        dispatch({type: FETCH_RESOURCES_SUCCESS, data: res.body});
      })

      // Async action failed...
      .catch(err => {
        // Dispatch specific "some resources failed" if needed...
        dispatch({type: FETCH_RESOURCES_FAIL});

        // Dispatch the generic "global errors" action
        // This is what makes its way into state.errors
        dispatch({type: ADD_ERROR, error: err});
      });
  };
}

আপনার রিডুসারটি কেবল ত্রুটিগুলির একটি অ্যারে পরিচালনা করতে পারে, এন্ট্রিগুলিকে যথাযথভাবে যোগ / সরিয়ে দেয়।

function errors(state = [], action) {
  switch (action.type) {

    case ADD_ERROR:
      return state.concat([action.error]);

    case REMOVE_ERROR:
      return state.filter((error, i) => i !== action.index);

    default:
      return state;
  }
}

1
এরিক, আপনি এখানে পরামর্শ দিয়েছিলেন এর সাথে আমারও অনুরূপ কিছু আছে তবে আশ্চর্যজনকভাবে আমি কখনই আমার কোড রিটার্নে ব্যবহার করি বা catchযদি এটি ব্যবহার করি তবে ফোন করা ফাংশনগুলি পরিচালনা করতে পারি না । আপনার মাথার উপরের অংশে এমন কোনও ধারণা আছে যেখানে আমি ভুল করতে পারি? মূলত, আমি যা করি তা একটি অনুরোধ প্রেরণ করে যা আমার শেষ হয়someHttpClient.get('/resources')fetch('/resources')500 Server Errorfetchroutes যার মধ্যে আমি mongooseখুব সাধারণ কিছু করার জন্য আমার মডেলটিতে একটি পদ্ধতি কল করি , যেমন কোনও পাঠ্য যুক্ত করা বা ডিবি থেকে কোনও পাঠ্য অপসারণ করা।
কেভিন ঘাবুসি

2
আরে, আমি একটি গুগল অনুসন্ধান থেকে এখানে এসেছি - একটি দুর্দান্ত উদাহরণের জন্য আপনাকে কেবল ধন্যবাদ জানাতে চেয়েছিলাম .. আমি একই সমস্যাগুলির সাথে লড়াই করছি, এবং এটি উজ্জ্বল। অবশ্যই সমাধানটি হ'ল স্টোরগুলিতে ত্রুটিগুলি সংহত করা। আমি কেন ... চিয়ার্সের কথা ভাবিনি?
স্পোক করুন

2
ত্রুটি দেখা দিলে কেউ কীভাবে একটি ফাংশন কার্যকর করতে পারে? উদাহরণস্বরূপ, ইউআইতে আমাকে একটি টোস্ট / সতর্কতা দেখাতে হবে, পিতামাতার উপাদানগুলির প্রপসগুলি আপডেট করে একটি সতর্কতা উপাদান রেন্ডার করতে হবে না
Gianfranco P.

111

এরিকের উত্তরটি সঠিক তবে আমি যুক্ত করতে চাই যে ত্রুটিগুলি যুক্ত করার জন্য আপনাকে পৃথক ক্রিয়াকলাপ চালাতে হবে না। একটি বিকল্প পদ্ধতির মধ্যে হ'ল একটি হ্রাসকারী যা ক্ষেত্রের সাথে কোনও ক্রিয়াকলাপ পরিচালনা করেerror । এটি ব্যক্তিগত পছন্দ এবং সম্মেলনের বিষয়।

উদাহরণস্বরূপ, রেডাক্স real-worldউদাহরণ থেকে ত্রুটি পরিচালনা করার ক্ষেত্রে:

// Updates error message to notify about the failed fetches.
function errorMessage(state = null, action) {
  const { type, error } = action

  if (type === ActionTypes.RESET_ERROR_MESSAGE) {
    return null
  } else if (error) {
    return error
  }

  return state
}

এর প্রতিটি সাফল্যের অনুরোধের অর্থ কি আমাদের উচিত RESET_ERROR_MESSAGE ধরণটি ত্রুটিমাটিস রিডুসারকে পাস করা উচিত?
দিমি মিকাদজে

2
@ দিমিত্রীমিকাদজে না এটি হয় না। এই ফাংশনটি ত্রুটিগুলির স্থিতির জন্য কেবল হ্রাসকারী। আপনি যদি RESET_ERROR_MESSAGE পাস করেন তবে এটি সমস্ত ত্রুটি বার্তা মুছে ফেলবে। আপনি যদি পাস না করেন এবং কোনও ত্রুটি ক্ষেত্র না থাকে তবে এটি কেবল অপরিবর্তিত অবস্থায় ফিরে আসে, সুতরাং পূর্ববর্তী ক্রিয়াগুলি থেকে কিছু ত্রুটি থাকলে, তারা সফলতার পরেও সেখানে উপস্থিত থাকবে ....
দুসান প্লাভক

আমি এই পদ্ধতির পছন্দ করি কারণ এটি errorগ্রাহকটি ক্রিয়াকলাপের সাথে সংযুক্ত হওয়ার সাথে সাথে এটি আরও প্রাকৃতিক ইনলাইন প্রতিক্রিয়ার অনুমতি দেয় । ধন্যবাদ ড্যান!
মাইক পেরেনউড

1
কীভাবে এটি কাজ করে আমি প্রায় মাথা পেতে পারি না। বাস্তব-জগতের উদাহরণটি বাদ দিয়ে, আপনার কাছে কি কোনও বিচ্ছিন্ন এবং নথি / ভিডিও রয়েছে এটি ব্যাখ্যা করে? এটি বেশিরভাগ প্রকল্পের একটি সুন্দর মূল প্রয়োজনীয়তা এবং আমি এই বিষয়ে ডকুমেন্টেশন বুঝতে খুব সহজ খুঁজে পেয়েছি। ধন্যবাদ।
ম্যাট স্যান্ডার্স

6
@ ম্যাটসাউন্ডার্স এটি বোঝার চেষ্টা করার সময় আমি ড্যান নিজেই একটি রেডাক্স কোর্সটি পেয়েছি (উত্তরদাতা, যিনি আসলে রেডাক্সের স্রষ্টা), এই উত্তরগুলির সাথে একসাথে এই ত্রুটি বার্তাগুলি প্রদর্শন করার একটি বিভাগ এবং আসল-দুনিয়ার উদাহরণ এটিকে বাসায় চালিত করেছে with আমাকে. শুভকামনা।
আগস্টান লাডো

2

আমি বর্তমানে কয়েকটি নির্দিষ্ট ত্রুটির জন্য ব্যবহার করছি (ব্যবহারকারীর ইনপুট বৈধতা) আমার সাব-হ্রাসকারীদের একটি ব্যতিক্রম ছুঁড়ে ফেলা, এটি আমার রুট রিডিউসারে ধরা এবং ক্রিয়া বস্তুর সাথে সংযুক্ত করতে হবে। তারপরে আমার কাছে একটি রিডাক্স-সাগা রয়েছে যা ত্রুটির জন্য অ্যাকশন অবজেক্টগুলি পরীক্ষা করে এবং সেই ক্ষেত্রে ত্রুটি ডেটা সহ রাষ্ট্র গাছ আপডেট করে।

তাই:

function rootReducer(state, action) {
  try {
    // sub-reducer(s)
    state = someOtherReducer(state,action);
  } catch (e) {
    action.error = e;
  }
  return state;
}

// and then in the saga, registered to take every action:
function *errorHandler(action) {
  if (action.error) {
     yield put(errorActionCreator(error));
  }
}

এবং তারপরে এরিকের বর্ণনা অনুসারে ত্রুটিটি রাষ্ট্র গাছটিতে যুক্ত করা।

আমি এটি খুব কম পরিমাণে ব্যবহার করি, তবে এটি যুক্তিটিকে নকল করতে বাধা দেয় যা বৈধভাবে হ্রাসকারীর মধ্যে রয়েছে (যাতে এটি নিজেকে একটি অবৈধ অবস্থা থেকে রক্ষা করতে পারে)।


1

এপিআই সম্পর্কিত সমস্ত ত্রুটি পরিচালনা করতে কাস্টম মিডলওয়্যারটি লিখুন। এক্ষেত্রে আপনার কোডটি আরও পরিষ্কার হবে।

   failure/ error actin type ACTION_ERROR

   export default  (state) => (next) => (action) => {

      if(ACTION_ERROR.contains('_ERROR')){

       // fire error action
        store.dispatch(serviceError());

       }
}

1
আইএমএইচও ডিবাগ করাও কঠিন করে তোলে
ক্রিসজলি

2
এর জন্য আপনার মিডলওয়্যারের দরকার নেই, আপনি ifএকটি হ্রাসকারীতে ঠিক একইটি লিখতে পারেন
জুয়ান ক্যাম্পা

যদি 50 টিরও বেশি এপিআই থাকে তবে আপনাকে সর্বত্র লিখতে হবে। পরিবর্তে আপনি ত্রুটিটি পরীক্ষা করতে কাস্টম মিডলওয়্যার লিখতে পারেন।
শ্রাবণ

0

আমি যা করি তা হ'ল আমি প্রতি প্রভাবের ভিত্তিতে সমস্ত ত্রুটি পরিচালনা করার বিষয়টি কেন্দ্রীয় করে আছি

/**
 * central error handling
 */
@Effect({dispatch: false})
httpErrors$: Observable<any> = this.actions$
    .ofType(
        EHitCountsActions.HitCountsError
    ).map(payload => payload)
    .switchMap(error => {
        return of(confirm(`There was an error accessing the server: ${error}`));
    });

-8

আপনি অক্ষগুলি এইচটিটিপি ক্লায়েন্ট ব্যবহার করতে পারেন। এটি ইতিমধ্যে ইন্টারসেপ্টর বৈশিষ্ট্য প্রয়োগ করেছে। আপনি তখন অনুরোধ বা প্রতিক্রিয়াগুলি হ্যান্ডেল করার আগে বা ধরা পরে আটকাতে পারেন।

https://github.com/mzabriskie/axios#interceptors

// Add a request interceptor
axios.interceptors.request.use(function (config) {
    // Do something before request is sent
    return config;
  }, function (error) {
    // Do something with request error
    return Promise.reject(error);
  });

// Add a response interceptor
axios.interceptors.response.use(function (response) {
    // Do something with response data
    return response;
  }, function (error) {
    // Do something with response error
    return Promise.reject(error);
  });


হ্যাঁ তবে আপনি রিডেক্সে কিছু পাঠাচ্ছেন না?
Eino Mäkitalo

এই পদ্ধতির খারাপ নয়। সাধারণত রেডেক্সে স্টোরটি একটি সিঙ্গলটন এবং আপনি অক্ষ অক্ষ ইন্টারসেপ্টর ফাইলগুলিতে স্টোর আমদানি করতে পারেন এবং কোনও ক্রিয়াকলাপ শুরু করতে store.dispatch () ব্যবহার করতে পারেন। এটি সিস্টেমে সমস্ত এপিআই ত্রুটি 1 জায়গায় হ্যান্ডেল করার একক পদ্ধতির
বুধ্মিচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.