NestJS处理HttpModule错误

时间:2019-11-23 00:15:10

标签: rxjs observable nestjs

NestJS具有以下使用其HttpModule的示例:

@Injectable()
export class CatsService {
  constructor(private readonly httpService: HttpService) {}

  findAll(): Observable<AxiosResponse<Cat[]>> {
    return this.httpService.get('http://localhost:3000/cats');
  }
}

我的问题是,客户端代码(最有可能是Controller)如何处理此响应?它如何处理可观察对象,以便可以访问Cat[]。或者,如果Http请求抛出诸如404之类的错误,该怎么办?

在这种情况下,NestJS客户端(控制器)如何与服务提供的findAll()方法进行交互?

2 个答案:

答案 0 :(得分:0)

我对NestJ不太熟悉,但是如果您想运行一个可观察的http请求,则可以执行以下操作来消耗和catchError

XCopyArea()

答案 1 :(得分:0)

如果由于某种原因,您提供给HttpService的URL返回404,则该错误将通过服务传播回控制器,最终传播到调用原始URL的客户端。在幕后,NestJS将预订所有返回的Observable,以便您不必担心,您可以直接从Controller返回调用。因此,在上面的示例中,假设我们有一个看起来像这样的控制器:

@Controller('cats')
export class CatsController {
  constructor(private readonly catsService: CatsService) {}

  @Get()
  findAllCats(): Observable<Cat[]> {
    return this.catsService.findAll();
  }
}

CatsService看起来像这样

@Injectable()
export class CatsService {
  constructor(private readonly httpService: HttpService) {}

  findAll(): Observable<Cat[]> {
    return this.httpService.get('http://localhost:3000/cats');
  }
}

假设您正在呼叫另一台服务器(即该服务器未在端口3000上运行),并且 /cats不是有效的端点,并且该服务器向您返回404,httpService的响应将通过CatsService冒泡到达CatsController,由NestJS处理订阅,并将响应发送回客户端。如果您要进行一些自定义错误处理,则需要以其他方式进行处理。测试HttpService对事物的反应的一种好方法是创建一个简单的终结点并调用错误的URL(例如https://google.com/item,它是404)