Как найти ошибку в угловом обещании или наблюдаемом? - PullRequest
0 голосов
/ 20 мая 2018

В консоли браузера отображается следующая ошибка:

zone.js:668 Error: Uncaught (in promise): [object Undefined]
    at resolvePromise (zone.js:814)
    at resolvePromise (zone.js:771)
    at zone.js:873
    at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:421)
    at Zone.push../node_modules/zone.js/dist/zone.js.Zone.runTask (zone.js:188)
    at drainMicroTaskQueue (zone.js:595)
    at ZoneTask.push../node_modules/zone.js/dist/zone.js.ZoneTask.invokeTask [as invoke] (zone.js:500)
    at invokeTask (zone.js:1540)
    at globalZoneAwareCallback (zone.js:1577)

Я не знаю, где искать исходный код.

ОБНОВЛЕНИЕ: та же страница, открытая в Firefox, выдает сообщение:

Error: Uncaught (in promise): [object Undefined]
Stack trace:
resolvePromise@http://localhost:4200/polyfills.js:3131:31
makeResolver/<@http://localhost:4200/polyfills.js:3041:17
setError@http://localhost:4200/scripts.js:979:21
messageCallback@http://localhost:4200/scripts.js:1092:25
./node_modules/zone.js/dist/zone.js/</ZoneDelegate.prototype.invokeTask@http://localhost:4200/polyfills.js:2738:17
./node_modules/zone.js/dist/zone.js/</Zone.prototype.runTask@http://localhost:4200/polyfills.js:2505:28
./node_modules/zone.js/dist/zone.js/</ZoneTask.invokeTask@http://localhost:4200/polyfills.js:2813:24
invokeTask@http://localhost:4200/polyfills.js:3857:9
globalZoneAwareCallback@http://localhost:4200/polyfills.js:3883:17
 zone.js:668

ОБНОВЛЕНИЕ: В случае, если ошибка связана с моим недавно добавленным исходным кодом перехватчика, вот как я могу обработать возможное исключение:

  intercept(
    request: HttpRequest<any>,
    next: HttpHandler
  ): Observable<HttpEvent<any>> {
    return this.addAuthHeader(request, next);
  }

  private addAuthHeader(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    console.log('=======>> Intercepting the http request to add the jwt token in the header');
    const tokenPromise: Promise<any> = this.keycloakClientService.getToken();
    const tokenObservable: Observable<any> = Observable.fromPromise(tokenPromise);
    tokenObservable.map(authToken => {
      console.log('Token value: ' + authToken);
      // Clone the request before it is sent to the server
      // as the original request is immutable and cannot be changed
      request = request.clone({
        setHeaders: {
          'Authorization': AUTH_HEADER_PREFIX + authToken
        }
      });
      console.log('=======>> The request has been cloned');
    });

    console.log('Handle the request in the interceptor chain');
    return next.handle(request)
      .catch(response => {
        if (response instanceof HttpErrorResponse) {
           if (response.status === 401) {
             // TODO redirect to the login route or show a modal
           }
          console.log('The error has been handled by the interceptor', response);
        }

        return Observable.throw(response);
      })
      .do((response: HttpEvent<any>) => {
        if (response instanceof HttpResponse) {
          console.log('The response has been handled by the interceptor', response);
        }
      });
  }

1 Ответ

0 голосов
/ 20 мая 2018
zone.js:668 Error: Uncaught (in promise): [object Undefined]

Это ошибка, которая выходит за рамки вашего исходного кода.Вот почему нет трассировки стека, которая связана с чем-то, что вы можете отладить напрямую.Вы можете попытаться изменить свой исходный код или добавить сообщения журнала консоли, но я думаю, что это не поможет вам найти его.

Скорее всего, это ошибка конфигурации.

Вы можете получить эту ошибку, когда Angular не сможет загрузить модули.Проверьте каждый из ваших модулей и убедитесь, что все объявления, импорт, экспорт и т. Д. И т. Д. Верны.Убедитесь, что вы используете правильные токены инъекций и инъекционные ссылки.

Если это происходит после запуска приложения.Это может быть ошибка ленивой загрузки модуля.Повторите описанные выше шаги.

Если это не поможет найти причину, необходимо удалить как можно больше вещей и медленно добавить их обратно.Пока вы не найдете виновника.

Создайте пустой компонент, который ничего не делает, и сделайте его компонентом ввода.Закомментируйте всех ваших провайдеров и закомментируйте все ваши декларации.Продолжайте комментировать то, что использует основной модуль, до тех пор, пока приложение не запустится успешно.

Медленно добавляйте своих провайдеров и декларации, пока оно снова не сломается.

Это должно помочь вам сузить место в конфигурации вашего модуля.проблема в.Надеюсь, что именно в этом причина проблемы.

Конечно, есть много других причин, которые могут вызвать эту ошибку.

  • Попробуйте обернуть исходный код, который использует сторонние (неугловые) библиотеки в zone.runOutsideAngular(()=>{....}), чтобы любые необработанные ошибки не отслеживались зонами.
  • Создайте приложение в рабочем режиме, но включите исходные карты для отладки.ng build --prod --sourcemaps
  • Добавьте службу ErrorHandler и посмотрите, не обнаружит ли она ошибку.Как это позволит вам осмотреть брошенный объект.Вы добавляете провайдера в свой модуль следующим образом {provide: ErrorHandler, useClass: MyHandlerService}, где MyHandlerService реализует ErrorHandler.
...