在拦截器上获取令牌时出错 - 输入'Promise >>'不能赋值为'Observable' >”

问题描述 投票:1回答:2

我正在创建一个拦截器来发送令牌以及Api的请求。

我使用@ionic/storage来存储我的用户信息。但是,当我尝试将构造函数中的令牌保存到变量(例如私有令牌:字符串)时,即使令牌存在,我的拦截器也无法获取该值。我相信这是因为拦截是在this.storage.get函数结束之前执行的。

我怎样才能解决这个问题?

我已经尝试将this.storage.get函数放在拦截中,但返回错误:

输入'Promise <void | Observable <HttpEvent <any >>>'不能赋值为'Observable <HttpEvent <any >>'。 'Promise <void |类型中缺少属性'_isScalar'可观察的<HttpEvent >>'。

看看代码:

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {  
    return this.storage.get('token')
        .then((token) => {
            if (token) {
                const newRequest = req.clone({ setHeaders: { 'Authorization': `Bearer ${token}` } });

                return next.handle(newRequest);
            } else {
                return next.handle(req);
            }
        })
        .catch(() => {
            //TODO: Trata erro
        })
}

谢谢您的帮助。

angular ionic-framework
2个回答
0
投票

在返回之前将存储承诺转换为Observable

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    var promise = this.storage.get('token')
        .then((token) => {
            if (token) {
                const newRequest = req.clone({ setHeaders: { 'Authorization': `Bearer ${token}` } });

                return next.handle(newRequest);
            } else {
                return next.handle(req);
            }
        })
        .catch((error) => {
            //TODO: Trata erro
            throw error;
        })
    return Observable.fromPromise(promise);
}

0
投票

你可以用Promise方法将你的Observable转换为Observable.fromPromise

© www.soinside.com 2019 - 2024. All rights reserved.