Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >多个HTTP拦截器中的next.handle(request)失败:未定义

多个HTTP拦截器中的next.handle(request)失败:未定义
EN

Stack Overflow用户
提问于 2020-06-29 10:12:42
回答 1查看 4.3K关注 0票数 2

在一个项目中,我使用两个HTTP拦截器:一个向每个请求添加一个JWT令牌,另一个拦截传入的401错误状态。

我调用一个单独的程序来获取此服务中我的应用程序的所有反馈:

代码语言:javascript
运行
AI代码解释
复制
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

import { environment } from '@environments/environment';
import { Feedback } from '@app/_models/feedback';

@Injectable({ providedIn: 'root' })
export class FeedbackService {
    constructor(
        private http: HttpClient
    ) {}

    getAll() {
        return this.http.get<Feedback[]>(`${environment.apiUrl}/feedback`);
    }

    getById(id: string) {
        return this.http.get<Feedback>(`${environment.apiUrl}/feedback/${id}`);
    }

    delete(id: string) {
        return this.http.delete(`${environment.apiUrl}/feedback/${id}`);
    }
}

JWT拦截器:

代码语言:javascript
运行
AI代码解释
复制
import { Injectable } from '@angular/core';
import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http';
import { Observable } from 'rxjs';

import { environment } from '@environments/environment';
import { AuthorizationService } from 'src/shared/authorization.service';

@Injectable()
export class JwtInterceptor implements HttpInterceptor {
    constructor(private auth: AuthorizationService) { }

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        // add auth header with jwt if user is logged in and request is to the api url
        const authenticatedUser = this.auth.getAuthenticatedUser();
        if (authenticatedUser == null) {
            return;
        }
        authenticatedUser.getSession( (err, session) => {
            if (err) {
                console.log(err);
                return;
            }
            const isApiUrl = request.url.startsWith(environment.apiUrl);
            const token = session.getIdToken().getJwtToken();
            const headers = new Headers();
            headers.append('Authorization', token);
            if (this.auth.isLoggedIn() && isApiUrl) {
                request = request.clone({
                    setHeaders: {
                        Authorization: token,
                    }
                });
            }

            return next.handle(request);
        });
    }
}

错误拦截器:

代码语言:javascript
运行
AI代码解释
复制
import { Injectable } from '@angular/core';
import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';

import { AccountService } from '@app/_services';

@Injectable()
export class ErrorInterceptor implements HttpInterceptor {
    constructor(private accountService: AccountService) {}

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        console.log(next.handle(request));
        return next.handle(request).pipe(catchError(err => {
            if (err.status === 401) {
                // auto logout if 401 response returned from api
                this.accountService.logout();
            }

            const error = err.error.message || err.statusText;
            return throwError(error);
        }));
    }
}

当我在app.module中提供两个拦截器时,

代码语言:javascript
运行
AI代码解释
复制
{ provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true },
{ provide: HTTP_INTERCEPTORS, useClass: JwtInterceptor, multi: true },

我总是收到下面的错误提示。这是因为next.handle(request)显然是undefined,而我真的不知道为什么。只使用错误拦截器是没有问题的。

代码语言:javascript
运行
AI代码解释
复制
ERROR TypeError: Cannot read property 'pipe' of undefined
    at ErrorInterceptor.intercept (error.interceptor.ts:14)
    at HttpInterceptorHandler.handle (http.js:1958)
    at HttpXsrfInterceptor.intercept (http.js:2819)
    at HttpInterceptorHandler.handle (http.js:1958)
    at HttpInterceptingHandler.handle (http.js:2895)
    at MergeMapSubscriber.project (http.js:1682)
    at MergeMapSubscriber._tryNext (mergeMap.js:46)
    at MergeMapSubscriber._next (mergeMap.js:36)
    at MergeMapSubscriber.next (Subscriber.js:49)
    at Observable._subscribe (subscribeToArray.js:3)

只使用JwtInterceptor会产生以下错误,我不知道它是从哪里来的。当然,我会希望两者都使用。在配置多个拦截器时,我是否遗漏了什么?

代码语言:javascript
运行
AI代码解释
复制
ERROR TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
    at subscribeTo (subscribeTo.js:27)
    at subscribeToResult (subscribeToResult.js:11)
    at MergeMapSubscriber._innerSub (mergeMap.js:59)
    at MergeMapSubscriber._tryNext (mergeMap.js:53)
    at MergeMapSubscriber._next (mergeMap.js:36)
    at MergeMapSubscriber.next (Subscriber.js:49)
    at Observable._subscribe (subscribeToArray.js:3)
    at Observable._trySubscribe (Observable.js:42)
    at Observable.subscribe (Observable.js:28)
    at MergeMapOperator.call (mergeMap.js:21)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-29 13:12:24

重写你的JwtInterceptor:

代码语言:javascript
运行
AI代码解释
复制
import { HttpInterceptor, HttpHandler, HttpRequest, HttpEvent } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable, from } from 'rxjs';

import { environment } from '@environments/environment';
import { AuthorizationService } from 'src/shared/authorization.service';


@Injectable()
export class JwtInterceptor implements HttpInterceptor {
    constructor(private auth: AuthorizationService) { }

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        return from(this.getSessionWithAuthReq(request, next));
    }

    async getSessionWithAuthReq(request: HttpRequest<any>, next: HttpHandler){
        const authenticatedUser = this.auth.getAuthenticatedUser();
        
        if (authenticatedUser) {
            const authRequest:  HttpRequest<any>  = await new Promise( (resolve) => {
                authenticatedUser.getSession( (err, session) => {
                    if (err) {
                        console.log(err);
                        // want to go on without authenticating if there is an error from getting session 
                        return resolve(request);
                    }
                    const isApiUrl = request.url.startsWith(environment.apiUrl);
                    const token = session.getIdToken().getJwtToken();
                    const headers = new Headers();
                    headers.append('Authorization', token);
                    if (this.auth.isLoggedIn() && isApiUrl) {
                        const req = request.clone({
                            setHeaders: {
                                Authorization: token,
                            }
                        });
                        return resolve(req);
                    }
                    return resolve(request);
                });
            });
            
            
            return next.handle(authRequest).toPromise();
        }

        return next.handle(request).toPromise();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62635885

复制
相关文章
Jquery的折叠效果
在进行web前端开发中,会有一些关于介绍的页面,在这些页面里有类似名词解释的,如果直接将解释和名词放在页面上就会使整个页面显得东西凌乱,且不易于查看自己需要的名词,这时可以用到折叠的方式来解决。即点击名词,将名词的解释展开,再次点击名词,名词解释合上。下面我来说说通过jquery来实现折叠效果,来看代码:
OECOM
2020/07/01
4K0
谷歌与Verily发布新研究,可通过视网膜图像用AI检测心脏病
安妮 编译整理 量子位 出品 | 公众号 QbitAI 心脏病是一种常见的高发疾病。传统的治疗方法通常依赖于心电图、超声、X射线等大型仪器,可能不久后,会有一种更简单的心脏病检测方法问世。 视网膜图像
量子位
2018/03/27
5910
谷歌与Verily发布新研究,可通过视网膜图像用AI检测心脏病
曲线折叠
曲线折叠 clear ; close all; %正常绘图 x=0:0.005:5; y=exp(-6*x).*sin(x*40)*6+exp(5*x)*5e-11.*sin(x*20); figur
万木逢春
2019/04/30
1.8K0
曲线折叠
cshtml折叠
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/147859.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/07
1.7K0
vim 代码折叠之设置默认代码不折叠
我选用 syntax 来定义折叠,这种方式比较简单,但是当配置完这个值后,你打开代码,就会发现 vim 默认把所有代码都折叠了,这显然不是我想要的,google一番后找到办法,设置 foldlevelstart 为99后,打开默认没有折叠。
宋天伦
2023/10/18
4670
bootstrap 折叠
<button type="button" class="btn btn-primary" data-toggle="collapse" data-target="#demo"> 简单的可折叠组件 </button>
用户5760343
2019/07/05
2.3K0
bootstrap 折叠
折叠屏,vivo的高端打手?
2022年开年国产机销量大跳水,各实力玩家的出货成绩也都不尽人意,行业走向不景气的信号逐渐明显。
用户9702975
2022/05/30
5220
折叠屏手机的相关知识
折叠手机是智能手机的一种造型,柔性AMOLED屏幕是折叠手机的突破关键。智能手机行业迎来“折叠屏时代”,各大手机厂商积极布局。早在2018年10月底,国内柔性屏生产商柔宇科技就推出了全球首款折叠屏手机FlexPai(柔派)。2019年2月份,三星和华为相继发布了旗下第一款折叠屏手机:GalaxyFold和MateX,并亮相世界移动通信大会(MWC),揭开了“折叠屏手机时代”的帷幕。此外,TCL也在MWC上展示了一款自己研发的折叠屏手机,其外观和华为、柔派相似。
用户5777378
2019/11/04
6170
文字折叠效果
clip-path:使用裁剪方式创建元素的可显示区域。区域内的部分显示,区域外的隐藏。
小丞同学
2021/08/16
2.3K0
给 RecyclerView 加上折叠的效果
RecyclerView 有很高的自由度,可以说只有想不到没有做不到,真是越用越喜欢。这次用超简单的方法,让 RecyclerView 带上折叠的效果。
NanBox
2019/07/09
1.5K0
可折叠设备的桌面模式
可折叠设备向用户们提供了使用他们的手机做更多事情的可能性,包括*桌面模式**等创新,也就是当手机平放时,铰链处于水平位置,同时折叠屏幕处于部分打开的状态。
Android 开发者
2022/03/09
2.4K0
可折叠设备的桌面模式
微信小程序----折叠面板(MUI折叠面板)
总结: 1 每一个折叠面板需要一个布尔值变量来控制; 2 在控制详情隐藏和显示时,要将右侧的箭头对应切换; 3 showFrom函数对每一个布尔值变量的修改三目表达式的优化。
Rattenking
2021/02/01
1.9K0
微信小程序----折叠面板(MUI折叠面板)
2031. 折叠绳子
约翰注意到,在某些位置,他可以将绳子对折,这样,相对的绳索上的绳结就可以彼此完全对齐:
浪漫主义狗
2022/07/11
7000
2031. 折叠绳子
2031. 折叠绳子
约翰注意到,在某些位置,他可以将绳子对折,这样,相对的绳索上的绳结就可以彼此完全对齐:
浪漫主义狗
2023/09/04
1420
2031. 折叠绳子
Hexo next博客添加折叠块功能添加折叠代码块
前言 有大段的东西想要放上去,但又不想占据大量的位置。折叠是最好的选择。下面在Hexo的主题上定制添加折叠功能。 本文基于Hexo Next的主题修改。其他主题应该也差不多。效果如下:https://blog.rmiao.top/hexo-fold-block/ 在main.js中添加折叠js next主题的主要js位于themes/next/source/js/src/post-details.js, 在里面找合适的位置,添加如下代码: $(document).ready(function(){
Ryan-Miao
2018/03/14
2.4K0
Java过滤XSS脚本, 可通过Appscan扫描
项目中有时会需要把一些报错或者解决方案直接返回给前端, 如果直接返回原字符串, 可能会被恶意传参来实现xss注入. 例如常规业务访问一个页面读取文件&file=sdf.cpt, 如果文件不存在, 则页面返回没有找到sdf.cpt的报错. 恶意传参即: &file=sdf.cpt<script>alert(123);</script>, 这样页面会alert出来123; 这时需要我们在后台对于一些报错进行去脚本话. 一开始是用的正则, 后来发现可以注入的脚本方式太多了, 用正则越来越长.  1 &file=/
用户1216491
2018/01/24
2.5K1
【Flutter】ExpansionTile 可折叠列表
文章目录 一、ExpansionTile 构造方法 二、完整代码示例 三、相关资源 一、ExpansionTile 构造方法 ---- 下面是 ExpansionTile 的构造方法 ; 其中 required this.title 是必须要设置的参数 ; class ExpansionTile extends StatefulWidget { /// Creates a single-line [ListTile] with a trailing button that expands or coll
韩曙亮
2023/03/29
1.5K0
【Flutter】ExpansionTile 可折叠列表
折叠屏 ① | 华为资深专家解读折叠屏应用基础体验要求
每一次的硬件创新,特别是面对折叠屏手机这一全新的硬件形态时,对于UX设计师来说都是不小的挑战。相信大多数设计师都遇到过下面这种窘境,在设计过程中由于缺少基础规范参考,设计师一般会按照个人的主观经验及感觉做设计,这样就会出现同一App展开折叠时差别很大,缺乏统一性的情况,影响用户体验的现象。
软件绿色联盟
2022/03/31
7940
折叠屏 ① | 华为资深专家解读折叠屏应用基础体验要求
原来这才是折叠屏的刚需...
blocks|key|1337463|text||type|atomic|depth|inlineStyleRanges|entityRanges|offset|length|data|entityMap|IMAGE|mutability|IMMUTABLE|imageUrl|https://ask.qcloudimg.com/http-save/yehe-1258501/b880f7191538de17f3c8aa78c8453cb2.png|imageAlt^0|0|1|0^^$0|@$1|2|3|4|
程序猿DD
2022/09/09
1530
点击加载更多

相似问题

更改可折叠MaterializeCss上的图标

10

materializeCSS可折叠活动更改图标。

54

Materializecss可折叠组件无法正常工作

225

用Materializecss创建折叠式表格

14

单元上的jQuery可通过toggleClass折叠

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档