You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 12:45:34