बीच में एक पाइप बंद करो

Dec 15 2020

मेरे कोणीय ऐप में, मेरे पास एक टोकन रीफ़्रेश इंटरसेप्टर है जो 401-अनधिकृत त्रुटियों को स्वीकार करता है, एक एक्सेस टोकन को रीफ्रेश करने का प्रयास करता है, और फिर से मूल http अनुरोध करता है।

टोकन ताज़ा समापन बिंदु कुछ मामलों में भी विफल हो सकता है, और एक ज्ञात त्रुटि लौटा सकता है (मेरे मामले में यह 400 अमान्य_ त्रुटि त्रुटि है)।

इंटरसेप्टर का वह हिस्सा जो टोकन को ताज़ा करता है:

 return this.httpClient
  .request('POST', "token", { observe: 'response' })
  .pipe(
    map(response => {
      // some logic when the token was refreshed successfully
    }),
    catchError(err => {
      this.routingService.navigateToLoginNoQuery();
      return throwError(err); // a 400 - invalid_grant error
    })
  );

जब ऐसा होता है, तो यह एक कैचअपर ऑपरेटर को हो जाता है, जो 2 चीजें करता है: लॉगआउट (लॉगिन पेज पर पुनर्निर्देशन के साथ), और थ्रो इटरर (त्रुटि) देता है, यह त्रुटि यह 400-इनवैलिड_ग्रेंट त्रुटि है।

यह नई त्रुटि के कारण कुछ कैचअपर ऑपरेटर्स तक पहुंचने के लिए कार्य करता है जो मूल रूप से ताज़ा टोकन को ट्रिगर करता है।

केवल संदर्भ के लिए: मैं कैच ब्लॉक में त्रुटियों को लॉग करता हूं, और मैं इस तरह की त्रुटियों को लॉग इन करने से बचना चाहता हूं, क्योंकि वे आमतौर पर केवल इसका मतलब है कि उपयोगकर्ता का टोकन समाप्त हो गया है।

मैं क्या करना चाहूंगा किसी भी तरह इस ऑपरेटर श्रृंखला को रोकना है, और बस लॉगिन पृष्ठ पर पुनर्निर्देशित करना है।

क्या बीच में एक पाइप को रोकना संभव है, और बाहरी कैचफ्रूट और पाइप में अगले ऑपरेटर के लिए दोनों से बचना संभव है?

जवाब

1 GuerricP Dec 14 2020 at 23:25

Observableघटनाओं या त्रुटियों को नष्ट होने जा रहे घटक तक पहुंचने से रोकने के लिए आप एक खाली लौटा सकते हैं :

return this.httpClient
  .request('POST', "token", { observe: 'response' })
  .pipe(
    map(response => {
      // some logic when the token was refreshed successfully
    }),
    catchError(err => {
      this.routingService.navigateToLoginNoQuery();
      return EMPTY;
    })
  );
MishaBorisov Dec 14 2020 at 23:30

अगर मैं प्रश्न को ठीक से समझ गया, तो हो सकता है कि कोई टेक यूटिल ऑपरेटर आपकी मदद कर सकता है। उदाहरण इस तरह दिखेगा:

export class MyHttpInterceptor implements HttpInterceptor {
  anyError = new Subject();

  intercept(req: HttpRequest, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(req)
      .pipe(
         takeUntil(this.anyError),
         catchError(err => {
             this.anyError.next();
             ...
         }
      )
  }
}