{"record":{"id":"8cf828bd6244a6fe","repo":"jackwener/OpenCLI","slug":"unknown-sort-sortkey-valid-object-keys-so","errorCode":null,"errorMessage":"Unknown sort \"${sortKey}\". Valid: ${Object.keys(SORTS).join(', ')}","messagePattern":"Unknown sort \"(.+?)\"\\. Valid: (.+?)","errorType":"validation","errorClass":"ArgumentError","httpStatus":null,"severity":"warning","filePath":"clis/eastmoney/convertible.js","lineNumber":135,"sourceCode":"}\n\ncli({\n  site: 'eastmoney',\n  name: 'convertible',\n    access: 'read',\n  description: '可转债行情列表（默认按成交额排序）',\n  domain: 'push2.eastmoney.com',\n  strategy: Strategy.PUBLIC,\n  browser: false,\n  args: [\n    { name: 'sort',  type: 'string', default: 'turnover', help: '排序：turnover / change / drop / price / premium / value / put-trigger' },\n    { name: 'limit', type: 'int',    default: 20,         help: '返回数量 (max 100)' },\n  ],\n  columns: ['rank', 'bondCode', 'bondName', 'bondPrice', 'bondChangePct', 'stockCode', 'stockName', 'stockPrice', 'stockChangePct', 'convPrice', 'convValue', 'convPremiumPct', 'pureBondPremiumPct', 'putTriggerPrice', 'listDate'],\n  func: async (args) => {\n    const sortKey = String(args.sort ?? 'turnover').toLowerCase();\n    const sort = SORTS[sortKey];\n    if (!sort) throw new ArgumentError(`Unknown sort \"${sortKey}\". Valid: ${Object.keys(SORTS).join(', ')}`);\n    const limit = parseConvertibleLimit(args.limit);\n\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', 'b:MK0354');\n    url.searchParams.set('fields', 'f12,f14,f2,f3,f6,f229,f230,f232,f234,f235,f236,f237,f238,f239,f243');\n    url.searchParams.set('ut', 'bd1d9ddb04089700cf9c27f6f7426281');\n\n    const resp = await fetch(url, { headers: { 'User-Agent': 'Mozilla/5.0' } });\n    if (!resp.ok) throw new CommandExecutionError(`eastmoney convertible failed: HTTP ${resp.status}`);\n    let data;\n    try {","sourceCodeStart":117,"sourceCodeEnd":153,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/eastmoney/convertible.js#L117-L153","documentation":"ArgumentError thrown in the cli func (clis/eastmoney/convertible.js:135) when the `--sort` value, lowercased, is not a key of SORTS. Valid keys: change, drop, turnover, price, premium, value, put-trigger. The message lists all valid options. This is a client-side argument validation error; no network request is made.","triggerScenarios":"Running `opencli eastmoney convertible --sort ytm` (removed per #2109) or any misspelled/unknown key like `remaining`, `conv`, or a value with trailing whitespace that lowercases to something unknown. Also fires when scripts pass programmatic sort values not in SORTS.","commonSituations":"Older scripts using the pre-#2109 sort names `ytm` or `remainingYears` that were renamed to `put-trigger`; typos; shell variables containing empty or garbage sort values; users copying sort names from other eastmoney CLIs (e.g. etf.js uses a different SORTS map).","solutions":["Use one of the listed keys: turnover (default), change, drop, price, premium, value, put-trigger.","Replace legacy sort names: `--sort ytm`/`--sort remainingYears` → `--sort put-trigger` (per #2109 rename).","Check for typos and stray whitespace/quotes in the shell argument.","Run with no --sort to get the turnover-sorted default."],"exampleFix":"// before\nopencli eastmoney convertible --sort ytm\n// after\nopencli eastmoney convertible --sort put-trigger","handlingStrategy":"validation","validationCode":"const VALID_SORTS = ['change','drop','turnover','price','premium','value','put-trigger'];\nconst sortKey = String(args.sort ?? 'turnover').toLowerCase();\nif (!VALID_SORTS.includes(sortKey)) throw new Error(`--sort must be one of: ${VALID_SORTS.join(', ')}`);","typeGuard":null,"tryCatchPattern":"try {\n  await run(['eastmoney', 'convertible', '--sort', sortKey]);\n} catch (e) {\n  if (String(e.message).startsWith('Unknown sort')) {\n    console.error(`Invalid sort \"${sortKey}\"; using default turnover`);\n    await run(['eastmoney', 'convertible']);\n  } else throw e;\n}","preventionTips":["Use only documented keys: change, drop, turnover, price, premium, value, put-trigger.","Migrate legacy `ytm`/`remainingYears` sorts to `put-trigger` (issue #2109 rename).","Trim and lowercase user-supplied sort values before passing.","Check `--help` for the current sort list rather than reusing other CLIs' keys."],"tags":["cli","argument-validation","eastmoney","user-input"],"backgroundTag":"invalid-argument-value","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}