我想实现一个NestJS拦截器,它在请求处理程序被击中之前创建和写入一个elasticSearch条目,并在处理程序完成后用错误/成功信息更新这个条目。为了做到这一点,我使用:
@Injectable()
export class ElasticsearchInterceptor implements NestInterceptor {
constructor(private readonly elasticSearchService: ElasticsearchService) {}
async intercept(_context: ExecutionContext, next: CallHandler): Promise < Observable < any >> {
const elasticSearchPayload = new ElasticsearchPayloadBuilder()
.setOperation(...)
.build();
const elasticSearchEntry = await this.elasticSearchService.writeEntry(elasticSearchPayload);
return next
.handle()
.pipe(
catchError(err => {
elasticSearchPayload.status = err.status;
return throwError(err);
}),
tap(() => {
elasticSearchPayload.status = 'success';
}),
finalize(() => {
this.elasticSearchService.updateEntry(elasticSearchEntry.id, elasticSearchPayload));
}));
}只要updateEntry-call解决了问题,它就能正常工作,但是如果它失败了,就会导致未处理的拒绝。我想确保错误被捕获并抛出。我尝试将updateEntry-promise转换为一个新的可观察到的
finalize(() => {
return from(this.elasticSearchService.updateEntry(elasticSearchEntry.id, elasticSearchPayload))
.pipe(
catchError(err => throwError(err)));
}));但这并不能解决问题。如何防止未处理的拒绝并从updateEntry返回错误
发布于 2020-07-22 20:15:41
finalize只需在拆卸阶段调用所提供的回调(例如,在complete之后,从源调用error,从消费者调用unsubscribe ),这就是为什么我认为它不是这样工作的。
话虽如此,我的做法是:
const main$ = return next
.handle()
.pipe(
catchError(err => {
elasticSearchPayload.status = err.status;
return throwError(err);
}),
tap(() => {
elasticSearchPayload.status = 'success';
}),
);
const elastic$ = from(this.elasticService/* ... */).pipe(
// might want to ignore elements and receive only errors
ignoreElements(),
catchError(err => throwError(err)),
);
return concat(main$, elastic$)https://stackoverflow.com/questions/63038134
复制相似问题