{"record":{"id":"10f5f6cb05812c4d","repo":"jackwener/OpenCLI","slug":"no-data-10f5f6","errorCode":"NO_DATA","errorMessage":"eastmoney returned no rank data","messagePattern":"eastmoney returned no rank data","errorType":"error_code","errorClass":"CliError","httpStatus":null,"severity":"error","filePath":"clis/eastmoney/rank.js","lineNumber":78,"sourceCode":"\n    const url = new URL('https://push2.eastmoney.com/api/qt/clist/get');\n    url.searchParams.set('pn', '1');\n    url.searchParams.set('pz', String(limit));\n    url.searchParams.set('po', sort.order === 'desc' ? '1' : '0');\n    url.searchParams.set('np', '1');\n    url.searchParams.set('fltt', '2');\n    url.searchParams.set('invt', '2');\n    url.searchParams.set('fid', sort.fid);\n    url.searchParams.set('fs', fs);\n    url.searchParams.set('fields', FIELDS);\n    url.searchParams.set('ut', 'bd1d9ddb04089700cf9c27f6f7426281');\n\n    const resp = await fetch(url, { headers: { 'User-Agent': 'Mozilla/5.0', Accept: 'application/json' } });\n    if (!resp.ok) throw new CliError('HTTP_ERROR', `eastmoney rank failed: HTTP ${resp.status}`);\n    const data = await resp.json();\n    const diff = Array.isArray(data?.data?.diff) ? data.data.diff : [];\n    if (diff.length === 0) {\n      throw new CliError('NO_DATA', 'eastmoney returned no rank data', `market=${market} sort=${sortKey}`);\n    }\n\n    return diff.slice(0, limit).map((it, i) => ({\n      rank: i + 1,\n      code: it.f12,\n      name: it.f14,\n      price: it.f2,\n      changePercent: it.f3,\n      change: it.f4,\n      turnover: it.f6,\n      volume: it.f5,\n      turnoverRate: it.f8,\n      peDynamic: it.f9,\n      marketCap: it.f20,\n    }));\n  },\n});\n","sourceCodeStart":60,"sourceCodeEnd":96,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/eastmoney/rank.js#L60-L96","documentation":"After a successful HTTP response, the eastmoney rank CLI expects data.data.diff to be a non-empty array of ranking rows. If the response JSON has no diff array or it is empty, it throws CliError NO_DATA with context 'market=<market> sort=<sortKey>'. This means eastmoney answered OK but returned no ranking data for the requested market/sort.","triggerScenarios":"Calling rank with a market/fs combination that has no rows (e.g. an invalid or empty market filter), eastmoney returning {data:null} for a deprecated field set, or an off-hours/regulatory window where the queried list is empty.","commonSituations":"Typo'd or unsupported market argument, eastmoney silently returning empty payloads for certain fs values, API schema changes where diff moves or becomes an object instead of an array.","solutions":["Check the market argument is a valid one supported by the CLI (e.g. hsa, hkn) and re-run","Try a different sort key to confirm the API returns data for other queries","Inspect the raw endpoint with curl using the same fs/fid params to see what eastmoney actually returns","Update the CLI if eastmoney changed its response schema (diff no longer an array)"],"exampleFix":"// before\nrank({ market: 'hsaa', sort: 'change' }); // invalid market -> empty diff\n// after\nrank({ market: 'hsa', sort: 'change' });","handlingStrategy":"try-catch","validationCode":"const VALID_MARKETS = ['hsa','hkn'];\nif (!VALID_MARKETS.includes(args.market)) throw new Error(`unsupported market: ${args.market}`);","typeGuard":"function hasRankData(data) { return Array.isArray(data?.data?.diff) && data.data.diff.length > 0; }","tryCatchPattern":"try {\n  const rows = await rank({ market, sort });\n} catch (e) {\n  if (e.code === 'NO_DATA') {\n    console.warn(`no rank data for ${e.detail ?? market}; try another market/sort`);\n  } else throw e;\n}","preventionTips":["Validate market/sort values against the CLI's supported keys before calling","Treat empty results as data problems, not code bugs — log context (market, sort)","Cross-check with a direct curl of the endpoint when a query silently returns empty","Pin/update the CLI when eastmoney changes its response schema"],"tags":["api","empty-result","eastmoney","data"],"backgroundTag":"empty-api-response","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}