Невозможно реализовать перехватчик для отмены запроса axios в случае тайм-аута

#javascript #axios #interceptor

#javascript #axios #перехватчик

Вопрос:

В моем приложении Nestjs я использую вызовы Axios. Я пытаюсь прикрепить токен к каждому запросу axios, и только при ошибке таймаута я хочу, чтобы он отменял токен, регистрировал ошибку и останавливал этот запрос. В настоящее время с этим кодом перехватчик работает нормально, но он выполняет if (Axios.isCancel(ошибка)) { } блокирует каждый раз. Даже если тайм-аут отсутствует, и я получаю действительный ответ. Я не хочу отменять токен, если тайм-аут отсутствует.

В настоящее время для каждого запроса я получаю независимо от тайм-аута или нет!:

======Request canceled=== Cancel { message: 'Operation canceled due to timeout!' }

 import { Injectable, NestInterceptor, CallHandler, HttpCode } from '@nestjs/common';
import { Observable } from 'rxjs';

import Axios from 'axios';
import { request } from 'https';
import { timeout } from 'rxjs/operators';

@Injectable()
export class TimeoutInterceptor implements NestInterceptor {

  intercept(context: any, next: CallHandler): Observable<any> {

    const CancelToken = Axios.CancelToken;
    const source = CancelToken.source();

    const url:string = context.url? context.url: context.args[0].url;

    Axios.defaults.timeout = 2000;
    Axios.get(url, {
      cancelToken: source.token
    }).then( (res)=> {
      console.log(res,'');
    }, error => {
        throw new Axios.Cancel('Operation canceled due to timeout!');
    }
    ).catch( (error)=> {
       if (Axios.isCancel(error)) {
         console.log('=====================Request canceled=======', error);
       } else {
         // catchError(error => throwError(new Error('Service Timed out!')))
         console.log('--else part------------------------------------');
       }
     });
    return next.handle();
  }
}
  

Ответ №1:

Я считаю, что проблема в том, что вы всегда выдаете Axios.Cancel за любую ошибку во время запроса. Возможно, вам следует проверить это внутри обработчика ошибок promise, а не в блоке catch, вот так:

 Axios.get(url, {
  cancelToken: source.token
}).then( (res)=> {
  console.log(res,'');
}, (error) => {
  if (Axios.isCancel(error)) {
    throw new Axios.Cancel('Operation canceled due to timeout!');
  } else {
    console.log('IT IS NOT a timout error.');
  }       
}
).catch( (error)=> {
   console.log('Error during token cancelation');
});