首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在升级到NestJS v8和RxJS v7后没有按顺序错误[v8]元素

在升级到NestJS v8和RxJS v7后没有按顺序错误[v8]元素
EN

Stack Overflow用户
提问于 2022-03-24 18:28:31
回答 1查看 720关注 0票数 1

在升级到NestJS v8之后,我不得不将我的RxJS版本从6升级到7,然后它开始抛出ERROR [ExceptionsHandler] no elements in sequence错误。

这是应用程序服务中的一个示例方法:

代码语言:javascript
复制
  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错误。

我想出的解决办法如下:

代码语言:javascript
复制
  show(): Observable<any> {
    return from(this.repository.fetch()).pipe(
      filter((data) => data.length > 0),
      defaultIfEmpty([]),
      map((data) => data.map((datum) => parseData(datum)),
    );
  }

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

1- map运算符仍然运行,我不希望它运行。

第二个对我来说更重要的是,我必须更新我所有的服务/方法,这些服务/方法具有这样的有效性,这是非常疯狂的。

我的依赖关系如下:

代码语言:javascript
复制
 "dependencies": {
    "@nestjs/common": "^8.4.2",
    "@nestjs/core": "^8.4.2",
    "rxjs": "^7.5.5"
  },
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-24 19:55:02

我们决定在这里使用一个拦截器来设置defaultIfEmpty,就像这样:

代码语言:javascript
复制
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部分中:

代码语言:javascript
复制
import { DefaultIfEmptyInterceptor } from '../defaultIfEmpty.interceptor'
import { APP_INTERCEPTOR } from '@nestjs/core'
// ...

{
  provide: APP_INTERCEPTOR,
  useClass: DefaultIfEmptyInterceptor,
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71607700

复制
相关文章

相似问题

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