升级到 NestJS v8 和 RxJS v7 后,错误 [ExceptionsHandler] 没有按顺序排列元素

Beh*_*adi 5 observable rxjs nestjs

升级到 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)),
    );
  }
Run Code Online (Sandbox Code Playgroud)

虽然我有 NestJS v7 和 RxJS v6,但该方法运行得很好;换句话说,如果filter操作没有通过,则map根本不会调用操作符,并且 Observable 会停在那里。

但是升级到 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)),
    );
  }
Run Code Online (Sandbox Code Playgroud)

这样错误就消失了,但我还有两个问题:

1-map操作员仍然运行我不想要的

2-第二个对我来说更重要的是我必须更新所有具有这样的验证的服务/方法,这真的很疯狂。

我的依赖关系如下:

 "dependencies": {
    "@nestjs/common": "^8.4.2",
    "@nestjs/core": "^8.4.2",
    "rxjs": "^7.5.5"
  },
Run Code Online (Sandbox Code Playgroud)

Jay*_*iel 5

我们在 Discord 上确定可以在这里使用拦截器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([]))
  }
}
Run Code Online (Sandbox Code Playgroud)

然后将其全局绑定在providers模块的一部分中:

import { DefaultIfEmptyInterceptor } from '../defaultIfEmpty.interceptor'
import { APP_INTERCEPTOR } from '@nestjs/core'
// ...

{
  provide: APP_INTERCEPTOR,
  useClass: DefaultIfEmptyInterceptor,
}
Run Code Online (Sandbox Code Playgroud)