升级到 NestJS v8 和 RxJS v7 后,错误 [ExceptionsHandler] 没有序列中的元素
ERROR [ExceptionsHandler] no elements in sequence after upgrading to NestJS v8 and RxJS v7
升级到 NestJS v8 后,我不得不将我的 RxJS 版本从 6 升级到 7 然后它开始抛出 ERROR [ExceptionsHandler] no elements in sequence
错误。
这是其中一项应用服务中的示例方法:
show(): Observable<any> {
return from(this.repository.fetch()).pipe(
filter((data) => data.length > 0),
map((data) => data.map((datum) => parseData(datum)),
);
}
虽然我有 NestJS v7 和 RxJS v6,但该方法工作得很好;换句话说,如果 filter
操作没有被传递, map
操作符根本不会被调用并且 Observable 停在那里。
但是在升级到 NestJS v8 和 RxJS v7 之后,如果我的存储库没有 return 任何数据,应用程序开始抛出 ERROR [ExceptionsHandler] no elements in sequence
错误。
我想出的解决方法如下:
show(): Observable<any> {
return from(this.repository.fetch()).pipe(
filter((data) => data.length > 0),
defaultIfEmpty([]),
map((data) => data.map((datum) => parseData(datum)),
);
}
这样错误就消失了,但我还有两个问题:
1- map
运算符仍在运行,我不想要
2- 第二个对我来说更重要的是我必须更新我所有的 services/methods,它有这样的验证,这真的很疯狂。
我的依赖如下:
"dependencies": {
"@nestjs/common": "^8.4.2",
"@nestjs/core": "^8.4.2",
"rxjs": "^7.5.5"
},
我们在 Discord 上确定可以在此处使用 interceptor 来设置 defaultIfEmpty
,如下所示:
@Injectable()
export class DefaultIfEmptyInterceptor {
intercept(context: ExecutionContext, next: CallHandler) {
return next.handle().pipe(defaultIfempty([]))
}
}
然后全局绑定
{
provide: APP_INTERCEPTOR,
useClass: DefaultIfEmptyInterceptor,
}
升级到 NestJS v8 后,我不得不将我的 RxJS 版本从 6 升级到 7 然后它开始抛出 ERROR [ExceptionsHandler] no elements in sequence
错误。
这是其中一项应用服务中的示例方法:
show(): Observable<any> {
return from(this.repository.fetch()).pipe(
filter((data) => data.length > 0),
map((data) => data.map((datum) => parseData(datum)),
);
}
虽然我有 NestJS v7 和 RxJS v6,但该方法工作得很好;换句话说,如果 filter
操作没有被传递, map
操作符根本不会被调用并且 Observable 停在那里。
但是在升级到 NestJS v8 和 RxJS v7 之后,如果我的存储库没有 return 任何数据,应用程序开始抛出 ERROR [ExceptionsHandler] no elements in sequence
错误。
我想出的解决方法如下:
show(): Observable<any> {
return from(this.repository.fetch()).pipe(
filter((data) => data.length > 0),
defaultIfEmpty([]),
map((data) => data.map((datum) => parseData(datum)),
);
}
这样错误就消失了,但我还有两个问题:
1- map
运算符仍在运行,我不想要
2- 第二个对我来说更重要的是我必须更新我所有的 services/methods,它有这样的验证,这真的很疯狂。
我的依赖如下:
"dependencies": {
"@nestjs/common": "^8.4.2",
"@nestjs/core": "^8.4.2",
"rxjs": "^7.5.5"
},
我们在 Discord 上确定可以在此处使用 interceptor 来设置 defaultIfEmpty
,如下所示:
@Injectable()
export class DefaultIfEmptyInterceptor {
intercept(context: ExecutionContext, next: CallHandler) {
return next.handle().pipe(defaultIfempty([]))
}
}
然后全局绑定
{
provide: APP_INTERCEPTOR,
useClass: DefaultIfEmptyInterceptor,
}