You need to sign in or sign up before continuing.
debug-apifox-response.js 3.61 KB
#!/usr/bin/env node

/**
 * Apifox API 响应调试工具
 *
 * 功能:输出完整的 API 响应,帮助诊断问题
 */

const fs = require('fs');
const path = require('path');
const https = require('https');

// 加载配置
function loadConfig() {
  const envPath = path.join(__dirname, '../.env.apifox');
  const env = fs.readFileSync(envPath, 'utf-8');
  const config = {};

  env.split('\n').forEach(line => {
    const [key, ...valueParts] = line.split('=');
    const value = valueParts.join('=');
    if (key && !key.startsWith('#') && value) {
      config[key.trim()] = value.trim();
    }
  });

  return config;
}

// 发送 HTTPS 请求
function httpsRequest(options) {
  return new Promise((resolve, reject) => {
    console.log(`📡 请求 URL: https://${options.hostname}${options.path}`);
    console.log(`📋 请求头:`, JSON.stringify(options.headers, null, 2));

    const req = https.request(options, (res) => {
      console.log(`\n📊 响应状态码: ${res.statusCode}`);
      console.log(`📋 响应头:`, JSON.stringify(res.headers, null, 2));

      const chunks = [];

      res.on('data', chunk => {
        chunks.push(chunk);
      });

      res.on('end', () => {
        const raw = Buffer.concat(chunks).toString('utf8').trim();

        if (!raw) {
          console.log('⚠️  响应体为空');
          resolve({ raw: null, statusCode: res.statusCode });
          return;
        }

        console.log(`\n📦 响应体长度: ${raw.length} 字符`);
        console.log(`📄 响应体内容:`);
        console.log('---开始---');
        console.log(raw);
        console.log('---结束---\n');

        try {
          const json = JSON.parse(raw.replace(/^\uFEFF/, ''));
          resolve(json);
        } catch (err) {
          console.error(`❌ JSON 解析失败: ${err.message}`);
          resolve({ raw, parseError: err.message });
        }
      });
    });

    req.on('error', (err) => {
      console.error(`❌ 请求失败: ${err.message}`);
      reject(err);
    });

    req.end();
  });
}

// 主函数
async function main() {
  console.log('🔍 Apifox API 响应调试工具\n');

  const config = loadConfig();

  // 测试获取接口列表
  console.log('========================================');
  console.log('测试: 获取接口列表');
  console.log('========================================\n');

  const options = {
    hostname: 'api.apifox.com',
    path: `/api/v1/projects/${config.VITE_APIFOX_PROJECT_ID}/apis?pageSize=10`,
    method: 'GET',
    headers: {
      'Authorization': `Bearer ${config.VITE_APIFOX_TOKEN}`,
      'Content-Type': 'application/json'
    }
  };

  try {
    const response = await httpsRequest(options);

    console.log('========================================');
    console.log('解析结果');
    console.log('========================================\n');

    if (response.parseError) {
      console.log(`❌ 无法解析 JSON`);
      console.log(`原始响应:`, response.raw);
    } else {
      console.log(`✅ JSON 解析成功`);
      console.log(`响应类型: ${typeof response}`);
      console.log(`响应键:`, Object.keys(response));
      console.log(`\ndata 类型: ${typeof response.data}`);
      console.log(`data 是数组: ${Array.isArray(response.data)}`);
      console.log(`data 长度: ${response.data?.length || 0}`);
      console.log(`total: ${response.total}`);

      if (response.data && response.data.length > 0) {
        console.log(`\n第一个接口示例:`);
        console.log(JSON.stringify(response.data[0], null, 2));
      }
    }

  } catch (err) {
    console.error(`\n❌ 请求失败: ${err.message}`);
  }
}

main();