NestJS健康检查端点如何获取并展示Twilio状态URL的响应内容
问题解答
无论是否使用Terminus模块,该需求完全可以实现,以下是两种方案的实现思路:
不使用Terminus模块的实现方式
直接自己封装独立的健康检查接口即可,步骤如下:
- 引入HTTP请求工具(可以用Nest内置的
HttpService,或者第三方的axios库) - 在接口逻辑中主动请求Twilio状态接口,解析返回的JSON结构体,按需提取你需要的字段(比如状态标识、服务可用性、更新时间等)
- 自定义返回结构体,把Twilio的状态字段和你的服务自身状态整合后返回即可
示例代码参考:
import { Controller, Get } from '@nestjs/common'; import { HttpService } from '@nestjs/axios'; import { firstValueFrom } from 'rxjs'; @Controller('health') export class HealthController { constructor(private readonly httpService: HttpService) {} @Get() async checkHealth() { try { const twilioRes = await firstValueFrom( this.httpService.get('https://status.twilio.com/api/v2/status.json') ); // 按需提取字段,示例取了status和page两个根字段下的内容 const twilioStatus = { serviceStatus: twilioRes.data.status.indicator, serviceDescription: twilioRes.data.status.description, lastUpdated: twilioRes.data.page.updated_at }; return { status: 'ok', twilio: twilioStatus }; } catch (e) { return { status: 'fail', twilio: { status: 'unreachable', error: e.message } }; } } }
使用Terminus模块的实现方式
官方给出的pingCheck、responseCheck只是基础封装,Terminus支持完全自定义的健康检查指示器,你可以自己实现逻辑解析响应字段,步骤如下:
- 自定义继承
HealthIndicator的Twilio健康检查类 - 在类内部实现请求、解析JSON、提取字段的逻辑,根据返回的状态判断服务是否健康
- 把自定义的指示器注册到Terminus的健康检查配置中即可
示例代码参考:
import { Injectable } from '@nestjs/common'; import { HealthIndicator, HealthIndicatorResult, HealthCheckError } from '@nestjs/terminus'; import { HttpService } from '@nestjs/axios'; import { firstValueFrom } from 'rxjs'; @Injectable() export class TwilioHealthIndicator extends HealthIndicator { constructor(private readonly httpService: HttpService) { super(); } async check(key: string): Promise<HealthIndicatorResult> { try { const twilioRes = await firstValueFrom( this.httpService.get('https://status.twilio.com/api/v2/status.json') ); const isHealthy = twilioRes.data.status.indicator === 'none'; // 状态为none代表无异常 const result = this.getStatus(key, isHealthy, { serviceStatus: twilioRes.data.status.indicator, serviceDescription: twilioRes.data.status.description, lastUpdated: twilioRes.data.page.updated_at }); if (isHealthy) { return result; } throw new HealthCheckError('Twilio service abnormal', result); } catch (e) { const result = this.getStatus(key, false, { error: e.message }); throw new HealthCheckError('Twilio service unreachable', result); } } }
之后你就可以在健康检查的controller里直接引入这个自定义指示器使用,和官方内置的指示器用法完全一致。
内容的提问来源于stack exchange,提问作者João Fernandes
相关产品推荐
相关产品推荐

