gpt4 book ai didi

javascript - 使用 http 拦截器从 ionic 存储设置默认请求 header - Angular 5 - Ionic 3

转载 作者:太空狗 更新时间:2023-10-29 18:19:12 24 4
gpt4 key购买 nike

我正在尝试使用 Angular 5 新 HTTP 客户端在所有请求 header 中设置 token 值。下面是我的代码:

import {Injectable} from '@angular/core';
import {HttpEvent, HttpInterceptor, HttpHandler, HttpRequest} from '@angular/common/http';
import {Observable} from "rxjs/Observable";
import { Storage } from '@ionic/storage';
import {Globals} from '../globals/globals';

@Injectable()
export class Interceptor implements HttpInterceptor {
token: string;
constructor(private storage: Storage, private global: Globals){
this.storage.get('token').then((val) => {
this.token = val;
});
}

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
console.log(this.token) //undefined "only for first time on app start"
req = req.clone({
setHeaders: {
'Token': this.token,
'Version': this.global.version,
}
});
return next.handle(req);
}
}

虽然在请求 header 中添加 token 有效,但存在一个错误的异常。它不是第一次工作。问题在于 js 异步性质,req.clone 在从存储中获取 token 之前被执行。因为Ionic storage return promise,所以第一次出现这种情况怎么处理?

最佳答案

您可以合并这两个异步请求(获取 token 和处理请求)以在 token 准备好后执行(而不是在构造函数中获取它):

// -------------------------------------------------------------------------
// Please note that I'm using lettable/pipeable operators (RxJS > 5.5.x)
// https://github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md
// -------------------------------------------------------------------------

import { Injectable } from '@angular/core';
import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http';
import { Observable } from "rxjs/Observable";
import { Storage } from '@ionic/storage';
import { Globals } from '../globals/globals';

// New imports!
import { fromPromise } from 'rxjs/observable/fromPromise';
import { mergeMap } from 'rxjs/operators/mergeMap';

@Injectable()
export class Interceptor implements HttpInterceptor {

constructor(private storage: Storage, private global: Globals){ }

getToken(): Promise<any> {
return this.storage.get('token');
}

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return fromPromise(this.getToken()).pipe(
mergeMap(token => {

// Use the token in the request
req = req.clone({
setHeaders: {
'Token': token,
'Version': this.global.version,
}
});

// Handle the request
return next.handle(req);
}));
}
}

关于javascript - 使用 http 拦截器从 ionic 存储设置默认请求 header - Angular 5 - Ionic 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48340024/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com