如何用Node.js+TypeScript检查本地GraphQL Yoga服务器是否已运行?
Node.js + TypeScript下启动Redis PubSub前检查GraphQL Yoga健康状态的最佳实践
核心思路很明确:在启动Redis PubSub服务前,通过HTTP轮询GraphQL Yoga的健康检查端点,确认服务就绪后再初始化PubSub。这种方式能确保依赖服务正常运行,避免PubSub在无效状态下启动。
实现步骤与代码示例
1. 准备依赖
如果你的Node.js版本低于18,建议安装node-fetch来处理HTTP请求(类型支持更完善):
npm install node-fetch npm install -D @types/node-fetch
Node.js 18+可直接用原生fetch,只需确保@types/node版本≥18即可。
2. 编写健康检查函数
这个函数内置重试、超时逻辑,直到健康端点返回成功或达到重试上限:
import fetch from 'node-fetch'; // Node.js 18+可省略此导入 interface HealthCheckOptions { baseUrl: string; healthEndpoint: string; maxRetries: number; retryIntervalMs: number; timeoutMs: number; } async function waitForGraphQLYogaReady(options: HealthCheckOptions): Promise<void> { const { baseUrl, healthEndpoint, maxRetries, retryIntervalMs, timeoutMs } = options; const healthUrl = `${baseUrl}/${healthEndpoint.replace(/^\//, '')}`; // 兼容端点带/的情况 let retries = 0; while (retries < maxRetries) { try { const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), timeoutMs); const response = await fetch(healthUrl, { signal: controller.signal, method: 'GET', }); clearTimeout(timeoutId); if (response.ok) { console.log('✅ GraphQL Yoga服务健康检查通过'); return; } throw new Error(`健康检查返回状态码: ${response.status}`); } catch (err) { const error = err as Error; retries++; if (retries >= maxRetries) { throw new Error(`❌ 健康检查失败,已达最大重试次数(${maxRetries})。最后错误: ${error.message}`); } console.log(`⚠️ 第${retries}次健康检查失败,${retryIntervalMs}ms后重试。错误: ${error.message}`); await new Promise(resolve => setTimeout(resolve, retryIntervalMs)); } } }
3. 启动PubSub服务的主逻辑
在初始化Redis PubSub前调用健康检查函数,确认依赖就绪后再启动服务:
import { RedisPubSub } from 'graphql-redis-subscriptions'; import Redis from 'ioredis'; async function startRedisPubSub() { // 健康检查参数,可根据实际环境调整 const healthCheckConfig: HealthCheckOptions = { baseUrl: 'http://localhost:4000', healthEndpoint: 'live', maxRetries: 10, retryIntervalMs: 2000, // 每次重试间隔2秒 timeoutMs: 5000, // 单个请求超时5秒 }; try { // 先执行健康检查 await waitForGraphQLYogaReady(healthCheckConfig); // 初始化Redis连接与PubSub const redisConfig: Redis.RedisOptions = { host: 'localhost', port: 6379, // 添加你的Redis认证、数据库等配置 }; const pubSub = new RedisPubSub({ publisher: new Redis(redisConfig), subscriber: new Redis(redisConfig), }); console.log('🚀 Redis PubSub服务启动成功'); // 在这里添加你的PubSub业务逻辑,比如订阅频道 // pubSub.subscribe('user-updates', (payload) => { // console.log('收到用户更新:', payload); // }); } catch (err) { console.error('💥 服务启动失败:', (err as Error).message); process.exit(1); // 依赖未就绪时直接退出进程 } } // 启动服务 startRedisPubSub();
关键细节说明
- 超时与重试控制:通过
AbortController实现请求超时,避免单个请求挂起;重试机制确保给GraphQL Yoga足够的启动时间。 - 错误处理:健康检查失败时直接退出进程,防止PubSub在依赖未就绪的情况下运行,减少无效日志和资源占用。
- 可配置性:所有参数都做成可配置的,方便在不同环境(开发/测试/生产)调整重试次数、间隔等。
内容的提问来源于stack exchange,提问作者realplay
相关产品推荐
相关产品推荐

