- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个名为拦截器的服务,它可以获取后端发送的所有错误响应。在这个服务上,我有一个名为 AuthService 的服务(向后端发出申请的服务),它在我的构造函数变量上声明。我使用这个另一个服务来调用向用户显示消息的方法。
同时,当拦截器被触发时,AuthService 未定义,并且我的消息没有显示。
在尝试解决该问题时,我尝试在 appModule 的提供者上声明 authService。它解决了未定义的问题,但出现了另一个问题。因此,我得出结论,这不是解决方案。
下面是我的字体:
拦截器.ts
import { LoadingController } from '@ionic/angular';
import { Injectable } from '@angular/core';
import {
HttpEvent,
HttpHandler,
HttpInterceptor,
HttpRequest,
HttpHeaders,
HttpErrorResponse
} from '@angular/common/http';
import { BehaviorSubject, throwError, Observable } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { Router } from '@angular/router';
import { AuthService } from '../services/auth.service';
@Injectable()
export class HTTPStatus {
private requestInFlight$: BehaviorSubject<boolean>;
constructor() {
this.requestInFlight$ = new BehaviorSubject(false);
}
setHttpStatus(inFlight: boolean) {
this.requestInFlight$.next(inFlight);
}
getHttpStatus(): Observable<boolean> {
return this.requestInFlight$.asObservable();
}
}
@Injectable()
export class Interceptor implements HttpInterceptor {
constructor(
private _loadingController: LoadingController,
private _authService: AuthService, //This is the variable that comes undefined
private _router: Router
) {
}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return this.handleAccess(request, next);
}
private handleAccess(request: HttpRequest<any>, next: HttpHandler):
Observable<HttpEvent<any>> {
const token = JSON.parse(localStorage.getItem('currentToken'));
let changedRequest = request;
// HttpHeader object immutable - copy values
const headerSettings: { [name: string]: string | string[]; } = {};
for (const key of request.headers.keys()) {
headerSettings[key] = request.headers.getAll(key);
}
if (token && !(request.url.indexOf("viacep") != -1)) {
headerSettings['Authorization'] = token;
}
//headerSettings['Content-Type'] = 'application/json';
const newHeader = new HttpHeaders(headerSettings);
changedRequest = request.clone({
headers: newHeader
});
//console.log('Request', changedRequest);
return next.handle(changedRequest).pipe(catchError(err => {
this._authService.deuErro = true;
let mensagem: string = 'Ocorreu um erro desconhecido ao tentar processar a operação!'
switch (err.status){
case 400: if (err instanceof HttpErrorResponse && err.error instanceof Blob && err.error.type === "application/json") {
mensagem = "Não existem dados para serem gerados. Erro: " + err.status;
} else {
mensagem = err.error.message;
this._loadingController.dismiss();
}
break;
case 401: if (err.error.message === "Unauthorized"){
if (this._authService.userLogged.value.user) {
mensagem = 'Sua sessão foi expirada. Por gentileza, logue novamente! Erro: ' + err.status;
this._router.navigate(['auth/login']);
}else{
mensagem = mensagem + ' Erro: ' + err.status;
}
}
break;
case 500: if (err.error.message === "INVALID_CREDENTIALS") {
mensagem = 'Usuario ou senha incorretos. Digite novamente para realizar o login'
}else{
mensagem = mensagem + ' Erro: ' + err.status;
}
break;
default: mensagem = mensagem + ' (' + err.status + ')' + ' - ' + err.error.message
break;
}
this.exibir(mensagem)
return [];
}))
}
public exibir(msg) {
this._authService.open(msg); //This is the method that it tries to call
}
}
AuthService.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, BehaviorSubject } from 'rxjs';
import { map } from 'rxjs/operators';
import { Resolve, RouterStateSnapshot, ActivatedRouteSnapshot, Router } from '@angular/router';
import { ToastController, MenuController, AlertController, NavController } from '@ionic/angular';
import { environment } from 'src/environments/environment';
import { Storage } from '@ionic/storage';
import { promise } from 'protractor';
const API_STORAGE_KEY = 'spinopsstoragekey';
@Injectable({
providedIn: 'root'
})
export class AuthService implements Resolve<any>{
public userLogged: BehaviorSubject<any> = new BehaviorSubject({ imagem: null
, user: null
, nrCarteirinha: null
, listaBanners: null });
public token: string;
public users: BehaviorSubject<any[]> = new BehaviorSubject([]);
public deuErro: boolean = false;
public fl_comunicado: BehaviorSubject<boolean> = new BehaviorSubject(null);
constructor(
private _http: HttpClient,
private toastController: ToastController,
private _storage: Storage,
private _navController: NavController,
public _menuController: MenuController,
public _router: Router,
public alertController: AlertController,
) {
if (JSON.parse(localStorage.getItem('currentToken'))) {
const currentUser = JSON.parse(localStorage.getItem('currentUser'));
const currentToken = JSON.parse(localStorage.getItem('currentToken'));
const currentNrCarteirinha = JSON.parse(localStorage.getItem('currentUserLogin'));
const currentUserImage = JSON.parse(localStorage.getItem('currentUserImage'));
const currentListaBanner = JSON.parse(localStorage.getItem('currentListaBanner'));
this.token = currentUser && currentToken;
this.userLogged.next({
user: currentUser,
imagem: currentUserImage,
carteirinha: currentNrCarteirinha,
listaBanners: currentListaBanner
});
}
}
private URL = `${environment.apiUrl}/login`;
private User_URL = `${environment.apiUrl}/usuario`;
resolve(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<any> | Promise<any> | any {
}
login(dados: any, acessoRapido: boolean = false): Observable<any> {
let logon = dados;
if (acessoRapido){
logon = { ds_login: dados.dsLogin, ds_senha: dados.dsSenha, fl_salvar: dados.fl_salvar }
}
return this._http.post<any>(`${this.URL}`, logon)
.pipe(map(async user => {
const toast = await this.toastController.create({
message: 'Login realizado com sucesso.',
duration: 2000
});
if (user && user.token) {
localStorage.setItem('currentToken', JSON.stringify(user.token));
localStorage.setItem('currentUser', JSON.stringify(user.nomeUsuario));
localStorage.setItem('currentUserLogin', JSON.stringify(user.dsLogin));
localStorage.setItem('currentUserIdSegurado', JSON.stringify(user.idSegurado));
localStorage.setItem('currentUserImage', JSON.stringify(user.imagem));
localStorage.setItem('currentListaBanner', JSON.stringify(user.listaBanners));
this.userLogged.next({
user: user.nomeUsuario,
imagem: user.imagem,
carteirinha: user.dsLogin,
listaBanners: user.listaBanners
});
await this.setUserLogged(user);
await toast.present();
}
return user;
}));
}
logout(): void {
localStorage.removeItem('currentToken');
localStorage.removeItem('currentUser');
localStorage.removeItem('currentUserLogin');
localStorage.removeItem('currentUserIdSegurado');
localStorage.removeItem('currentUserImage');
localStorage.removeItem('currentListaBanner');
this._navController.navigateBack(['auth/login']).then(() => {
this._menuController.enable(false);
this.editUserLogged(null)
});
}
cadastrarConta(dados: any): Observable<any> {
this.deuErro = false
return this._http.post(`${environment.apiUrl}/beneficiario/novo`, dados);
}
alterarSenha(dados: any): Observable<any> {
this.deuErro = false
return this._http.put(`${environment.apiUrl}/beneficiario/alterar-senha`, dados);
}
public getUserRemember(): Promise<any> {
return this._storage.get(`${API_STORAGE_KEY}-lembrarUsuarios`);
}
public async setUserRemember(user): Promise<any> {
return this._storage.set(`${API_STORAGE_KEY}-lembrarUsuarios`, user);
}
public getUsersLogged(): Promise<any> {
return this._storage.get(`${API_STORAGE_KEY}-usuarioAutenticado`);
}
public setUserLogged(data: any) {
if (data) {
let users = [];
users.push(data);
return this._storage.set(`${API_STORAGE_KEY}-usuarioAutenticado`, users);
}
}
public editUserLogged(data: any) {
if (data.length > 0) {
return this._storage.set(`${API_STORAGE_KEY}-usuarioAutenticado`, data);
} else {
return this._storage.set(`${API_STORAGE_KEY}-usuarioAutenticado`, []);
}
}
async open(message, duration = 4000) {
const toast = await this.toastController.create({ message: `${message}`, duration: duration });
toast.present();
}
possuiComunicado() {
this._http.get(`${environment.apiUrl}/comunicado/possui`).subscribe((resolve: any) => {
this.fl_comunicado.next(resolve);
});
}
getComunicados() {
return this._http.get(`${environment.apiUrl}/comunicado/listar`);
}
setComunicado(nr_seq) {
return this._http.post(`${environment.apiUrl}/comunicado/${nr_seq}/ler`, {});
}
carregaImagem() {
const currentUserId = JSON.parse(localStorage.getItem('currentUserId'));
return this._http.get(`${this.User_URL}/carrega-imagem/${currentUserId}`, {
responseType: 'blob' as 'json'
});
}
getUserAvatar() {
return new Promise((resolve, reject) => {
this.carregaImagem().subscribe((res: any) => {
const file = new Blob([res], {
type: res.type
});
if (file.size !== 0) {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = e => resolve(reader.result);
} else {
resolve('assets/avatars/profile.jpg');
}
}, reject);
});
}
}
The error
最佳答案
这是 known issue由 HttpInterceptor 和 HttpClient 的循环依赖引起。
解释HttpClient
依赖于所有 HttpInterceptors
.AuthService
依赖于 HttpClient
.
在 HttpInterceptor 中注入(inject) AuthService 将创建一个无限循环。
HttpInterceptor -> AuthService -> HttpClient -> HttpInterceptor -> ∞
根据您的 Angular 版本,您将得到一个循环依赖错误,或者根本没有错误导致相关的注入(inject)服务为
undefined
,并且您的代码将默默地失败。
Injector
在拦截器构造函数而不是 AuthService 中,然后使用注入(inject)器手动检索服务。我不知道为什么,但你必须在这里使用某种延迟,否则 AuthService 可能仍然未定义。
platform.ready()
或
setTimeout
会做。
ready$
ReplaySubject
确保在使用之前加载 AuthService。
...
import {Injectable, Injector} from '@angular/core';
import {AuthService} from '../services/auth.service';
import {Platform} from '@ionic/angular';
...
@Injectable()
export class Interceptor implements HttpInterceptor {
private ready$ = new ReplaySubject<void>(1);
private authService: AuthService;
constructor(private platform: Platform, private injector: Injector ) {
this.platform.ready().then(() => {
this.authService = this.injector.get(AuthService);
this.ready$.next();
});
}
get ready$(): Observable<void> {
return this.ready$.asObservable();
}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return this.ready$.pipe(
first(),
switchMapTo(next.handle(req)),
catchError((error: HttpErrorResponse) => {
...
return throwError(error);
})
);
}
...
}
这应该有效,如果您需要进一步的帮助,请告诉我。
关于angular - 我的拦截器上未定义构造函数变量(Angular 8),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65845155/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How to nest OR statements in JavaScript? 有没有办法做到这一点:
在 JavaScript 中有没有办法让一个变量总是等于一个变量?喜欢var1 = var2但是当var2更新,也是var1 . 例子 var var1 = document.getElementBy
我正在努力理解这代表什么 var1 = var2 == var3 我的猜测是这等同于: if (var2 == var3): var1 = var2 最佳答案 赋值 var1 = var2
这个问题已经有答案了: What does the PHP error message "Notice: Use of undefined constant" mean? (2 个回答) 已关闭 8
我在临时表中有几条记录,我想从每条记录中获取一个值并将其添加到一个变量中,例如 color | caption -------------------------------- re
如何将字符串转为变量(字符串变量--> $variable)? 或者用逗号分隔的变量列表然后转换为实际变量。 我有 2 个文件: 列名文件 行文件 我需要根据字符串匹配行文件中的整行,并根据列名文件命
我有一个我无法解决的基本 php 问题,我也想了解为什么! $upperValueCB = 10; $passNodeMatrixSource = 'CB'; $topValue= '$uppe
这可能吗? php $variable = $variable1 || $variable2? 如果 $variable1 为空则使用 $variable2 是否存在类似的东西? 最佳答案 PHP 5
在 Perl 5.20 中,for 循环似乎能够修改模块作用域的变量,但不能修改父作用域中的词法变量。 #!/usr/bin/env perl use strict; use warnings; ou
为什么这不起作用: var variable; variable = variable.concat(variable2); $('#lunk').append(variable) 我无法弄清楚这一点
根据我的理解,在32位机器上,指针的sizeof是32位(4字节),而在64位机器上,它是8字节。无论它们指向什么数据类型,它们都有固定的大小。我的计算机在 64 位上运行,但是当我打印包含 * 的大
例如: int a = 10; a += 1.5; 这运行得很完美,但是 a = a+1.5; 此作业表示类型不匹配:无法从 double 转换为 int。所以我的问题是:+= 运算符 和= 运算符
您好,我写了这个 MySQL 存储过程,但我一直收到这个语法错误 #1064 - You have an error in your SQL syntax; check the manual that
我试图在我的场景中显示特定的奖牌,这取决于你的高分是基于关卡的目标。 // Get Medal Colour if levelHighscore goalScore { sc
我必须维护相当古老的 Visual C++ 源代码的大型代码库。我发现代码如下: bIsOk = !!m_ptr->isOpen(some Parameters) bIsOk的数据类型是bool,is
我有一个从 MySQL 数据库中提取的动态产品列表。在 list 上有一个立即联系 按钮,我正在使用一个 jquery Modal 脚本,它会弹出一个表单。 我的问题是尝试将产品信息变量传递给该弹出窗
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
jQuery Core Style Guidelines建议两种不同的方法来检查变量是否已定义。 全局变量:typeof variable === "undefined" 局部变量:variable
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: “Variable” Variables in Javascript? 我想肯定有一种方法可以在 JavaScrip
在语句中使用多重赋值有什么优点或缺点吗?在简单的例子中 var1 = var2 = true; 赋值是从右到左的(我相信 C# 中的所有赋值都是如此,而且可能是 Java,尽管我没有检查后者)。但是,
我是一名优秀的程序员,十分优秀!