在升级到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操作符,而可观察到的操作符就会在那里停止。
但是在升级到NestJS v8和RxJS v7之后,如果我的存储库不返回任何数据,应用程序就会开始抛出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运算符仍然运行,我不希望它运行。
第二个对我来说更重要的是,我必须更新我所有的服务/方法,这些服务/方法具有这样的有效性,这是非常疯狂的。
我的依赖关系如下:
"dependencies": {
"@nestjs/common": "^8.4.2",
"@nestjs/core": "^8.4.2",
"rxjs": "^7.5.5"
},发布于 2022-03-24 19:55:02
我们决定在这里使用一个拦截器来设置defaultIfEmpty,就像这样:
import {
CallHandler,
ExecutionContext,
Injectable,
NestInterceptor
} from '@nestjs/common'
import { defaultIfEmpty } from 'rxjs/operators'
@Injectable()
export class DefaultIfEmptyInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler) {
return next.handle().pipe(defaultIfEmpty([]))
}
}然后将其全局绑定到模块的providers部分中:
import { DefaultIfEmptyInterceptor } from '../defaultIfEmpty.interceptor'
import { APP_INTERCEPTOR } from '@nestjs/core'
// ...
{
provide: APP_INTERCEPTOR,
useClass: DefaultIfEmptyInterceptor,
}https://stackoverflow.com/questions/71607700
复制相似问题