首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NestJS拦截器- .pipe()中的句柄错误

NestJS拦截器- .pipe()中的句柄错误
EN

Stack Overflow用户
提问于 2020-07-22 15:44:37
回答 1查看 2.9K关注 0票数 3

我想实现一个NestJS拦截器,它在请求处理程序被击中之前创建和写入一个elasticSearch条目,并在处理程序完成后用错误/成功信息更新这个条目。为了做到这一点,我使用:

代码语言:javascript
复制
@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转换为一个新的可观察到的

代码语言:javascript
复制
finalize(() => {
    return from(this.elasticSearchService.updateEntry(elasticSearchEntry.id, elasticSearchPayload))
    .pipe(
        catchError(err => throwError(err)));
}));

但这并不能解决问题。如何防止未处理的拒绝并从updateEntry返回错误

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-22 20:15:41

finalize只需在拆卸阶段调用所提供的回调(例如,在complete之后,从源调用error,从消费者调用unsubscribe ),这就是为什么我认为它不是这样工作的。

话虽如此,我的做法是:

代码语言:javascript
复制
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$)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63038134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档