{"record":{"id":"56e1e2b9df28c532","repo":"jackwener/OpenCLI","slug":"no-data-56e1e2","errorCode":"NO_DATA","errorMessage":"ths hot-rank API returned no stock data","messagePattern":"ths hot-rank API returned no stock data","errorType":"error_code","errorClass":"CliError","httpStatus":null,"severity":"warning","filePath":"clis/ths/hot-rank.js","lineNumber":46,"sourceCode":"  strategy: Strategy.PUBLIC,\n  browser: false,\n  args: [\n    { name: 'limit', type: 'int', default: 20, help: '返回数量' },\n  ],\n  columns: ['rank', 'name', 'changePercent', 'heat', 'tags'],\n  func: async (args) => {\n    const limit = parseLimit(args.limit);\n    const resp = await fetch(THS_HOT_API_URL, {\n      headers: {\n        'Accept': 'application/json,text/plain,*/*',\n        'User-Agent': 'Mozilla/5.0',\n        'Referer': 'https://eq.10jqka.com.cn/',\n      },\n    });\n    if (!resp.ok) throw new CliError('HTTP_ERROR', `ths hot-rank failed: HTTP ${resp.status}`);\n    const payload = await resp.json();\n    const stocks = Array.isArray(payload?.data?.stock_list) ? payload.data.stock_list : [];\n    if (stocks.length === 0) throw new CliError('NO_DATA', 'ths hot-rank API returned no stock data');\n\n    return stocks.slice(0, limit).map((stock, index) => ({\n      rank: stock.order ?? index + 1,\n      name: stock.name ?? '',\n      changePercent: stock.rise_and_fall ?? '',\n      heat: stock.rate ?? '',\n      tags: tagsFromStock(stock),\n    }));\n  },\n});\n\nexport const __test__ = {\n  THS_HOT_API_URL,\n  parseLimit,\n  tagsFromStock,\n};\n","sourceCodeStart":28,"sourceCodeEnd":63,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/ths/hot-rank.js#L28-L63","documentation":"After a successful HTTP 200, the ths hot-rank command expects payload.data.stock_list to be a non-empty array. If it's empty or missing, CliError NO_DATA is thrown — the API responded but contained no rank rows.","triggerScenarios":"eq.10jqka.com.cn hot-rank endpoint returns JSON without data.stock_list (empty array, null, or different shape), e.g. market closed/pre-market with no ranked data, or response schema changed.","commonSituations":"Querying during non-trading hours when the rank list is empty; API contract drift after a site update; partial responses during maintenance windows.","solutions":["Retry during trading hours when the ranking has data","Log the full payload on failure and update the payload?.data?.stock_list path if the schema changed in clis/ths/hot-rank.js","Treat as expected-empty in your wrapper (catch NO_DATA and return []) if an empty market is acceptable","Verify the endpoint in a browser devtools network tab to confirm the current field layout"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":"function hasStockList(payload) {\n  return Array.isArray(payload?.data?.stock_list) && payload.data.stock_list.length > 0;\n}","tryCatchPattern":"let stocks;\ntry {\n  stocks = await thsHotRank({ limit });\n} catch (e) {\n  if (e?.code === 'NO_DATA') stocks = []; // market closed / empty rank\n  else throw e;\n}","preventionTips":["Run during trading hours when rank data is populated","Log the raw payload on NO_DATA to catch schema drift early","Provide a fallback data source or cached last-known ranks","Treat empty trading-day windows as expected-empty in dashboards"],"tags":["no-data","ths","api","empty-response"],"backgroundTag":"empty-api-response","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}