node.js - NestJS 拦截器 - 处理 .pipe() 内的错误
问题描述
我想实现一个 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 转换为新的 Observable
finalize(() => {
return from(this.elasticSearchService.updateEntry(elasticSearchEntry.id, elasticSearchPayload))
.pipe(
catchError(err => throwError(err)));
}));
但这并不能解决问题。如何防止未处理的拒绝并从中返回错误updateEntry
?
解决方案
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$)
推荐阅读
- javascript - 在哪里/如何进行单元测试和 xstate 保护功能?
- linux - QEMU 自动退出
- vue.js - Vue / Nuxt - 如何在视频元素中显示“海报”
- ios - 在 macOS Big Sur 上安装 react native 时出现“未定义符号:Swift.ExpressibleByFloatLiteral 的协议描述符”问题
- android - 如何知道android应用程序何时被强制杀死
- flutter - TextFormField 验证错误消息的对齐方式
- git - Tortoise GIT 回滚到上一个提交
- mysql - 从不同的mysql表中查询字段
- python - 发生异常:TimeoutException
- excel - 将单元格值从一张表复制到另一张表,并将其粘贴到具有特定值的单元格附近