gpt4 book ai didi

node.js - 巢JS : Interceptor both map and catchError

转载 作者:太空宇宙 更新时间:2023-11-03 23:14:40 26 4
gpt4 key购买 nike

我需要一个 NestJS 拦截器来归档请求,无论是在异常情况还是顺利路径情况下。创建如下:

public intercept(context: ExecutionContext, next: CallHandler): Observable<any> {

if (!this.reflector.get<boolean>(RequestMetaData.IS_PUBLIC_ROUTE, context.getHandler())) {
return next.handle().pipe(
map(data => {
const host = context.switchToHttp();
const req = host.getRequest();
const resp = host.getResponse();
this.persistRequest(data, req, resp)
.then(() => this.logger.log(`Request logged`))
.catch(e => {
this.logger.error(`Error logging request: ${e.message}`);
});
return data;
}));
}
return next.handle();
}

问题:

这只会记录快乐的路径。因为我不熟悉 RxJS,所以我创建了另一个来保留错误。例如:

public intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
return next
.handle()
.pipe(
catchError(err => {
return throwError(err);
})
);
}

如何定义一个存档两个路径的拦截器?

最佳答案

我认为您在这里使用了错误的运算符。内部映射也返回发布者。

您应该使用 flatMap 转换外部发布者,以便创建一个流,而不是嵌套流。

这是纯 RxJS 6 中的示例:

import { of, EMPTY } from 'rxjs';
import { map, flatMap, catchError } from 'rxjs/operators';

of(3,2,1,0,1,2,3).pipe(
flatMap(v => {
return of(v).pipe(
map(x => {
if(x===0) throw Error();
return 6 / x;
}),
catchError(error => {
console.log("Shit happens")
return EMPTY
}
)
)
}
))
.subscribe(val => console.log("Request " + val + " logged "));

每个请求(这里是数字)都是一个持久化事物的平面映射。平面 map 意味着持久化器再次返回一个可观察值。请参阅https://rxjs-dev.firebaseapp.com/api/operators/flatMap

这些内部可观察量的错误处理是通过catchError运算符完成的。它记录错误并返回一个空的可观察值,以指示内部可观察值“已死”。您可以在此处返回另一个可观察值,然后内部将继续。

外部可观察的,即您传入的请求,一路上继续下去。

我在这里创建了一个 stackblitz 应用程序:

https://rxjs-qkqkm2.stackblitz.io

祝 NestJS 和所有不同版本的 RxJS 好运。以上是版本 6。

编辑:

RxJS tap 方法是处理副作用的好方法。实现拦截方法如下:

public intercept(context: ExecutionContext, next: CallHandler): Observable<any> {

if (!this.reflector.get<boolean>(RequestMetaData.IS_PUBLIC_ROUTE, context.getHandler())) {

const host = context.switchToHttp();
const req = host.getRequest();
const resp = host.getResponse();

return next.handle().pipe(
tap({
next: (val) => {
this.persistRequest(val, req, resp);
},
error: (error) => {
this.persistRequest(AppError.from(error), req, resp);
}
})
);
}
return next.handle();
}

关于node.js - 巢JS : Interceptor both map and catchError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56928551/

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