У меня есть служба перехватчика ошибок, которая иногда не работает. В частности, перехватчик ошибок, похоже, не улавливает ошибку, созданную, когда электронная почта уже проверена.
Ошибка отправляется с сервера 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},
],