Angular HttpInterceptor не обнаруживает ошибку - PullRequest
0 голосов
/ 05 августа 2020

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

Ошибка отправляется с сервера nodejs express. server. js

/** Verify email */
router.route('/users/email-confirmation/:token').get((req, res) => {
  console.log('Confirm email')
  // Verify token
  f.verifyTokens(req.params.token, 'email')
  // Update user
  .then((email) => f.updateUserProperty(email, 'emailVerified', true)) //<-- Promise rejects here
  // Send response
  .then(user => f.sendSuccess(res, 200, 'Email verified'))
  // Catch error
  .catch(err => f.sendError(err, res));
});

server. js

/** Update user property
 * Returns user if successful
 */
const updateUserProperty = function(email, property, value) {
  return new Promise((resolve, reject) => {
    User.findOne({email: email}, (err, user) => {
      // Server error
      if (err) 
        return reject(newError(500, 'Internal server error', err))
      // No user found
      if (!user) 
        return reject(newError(401, 'Email is invalid', null))
      // Email already verified
      if (user.emailVerified) 
        return reject(newError(405, 'Email already verified', null))  //<--- Error thrown here
      // Success, update and save emailVerified property
      user[property] = value;
      user.save();
      return resolve(user)
    });
  })
}

Отформатируйте ответ об ошибке в согласованный объект json, а затем отправьте.

server . js

/** Sends http error response (server)
 * @param {json} err {statusCode, message, error}
 * @param {http} res http response
 */
const sendError = function(err, res) {
  console.log('sendError:', err);
  return res.status(err.statusCode).send({error: err}); //<-- Error sent to client here
}

error.interceptor.ts

import { AlertService } from './alert.service';
import { Injectable } from '@angular/core';
import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpResponse } from '@angular/common/http';
import { Observable, of } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { AuthenticationService } from '../services';

@Injectable()
export class ErrorInterceptor implements HttpInterceptor {
  constructor(
    private alertService: AlertService,
    private authenticationService: AuthenticationService) {}
  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(request).pipe(
      catchError((error) => {
        if (error.error instanceof ErrorEvent) {
          // A client-side or network error occurred.
          console.error('A client error occurred:', error.error.message);
        }
        // Unauthorized and attempted to access protected resource:
        // logout and redirect
        if (error.status === 403) {
          this.authenticationService.logout();
        }
        // Other errors
        console.log(error);
        this.alertService.error(error.error.error.message);
        const e = new HttpResponse<any>({body: error.error});
        return of(e);
      }
    ));
  }
}

Я включил услугу в качестве поставщика HTTP_INTERCEPTORS

  providers: [
    GridFunctionsService,
    AlertService,
    {
      provide: HTTP_INTERCEPTORS,
      useClass: AuthInterceptor,
      multi: true},
    {
      provide: HTTP_INTERCEPTORS,
      useClass: ErrorInterceptor,
      multi: true},
    ],
...