jackwener/OpenCLI · error · CommandExecutionError
${label} failed: ${message} (${payload.code})
Error message
${label} failed: ${message} (${payload.code}) What it means
fetchNowcoderData validates every Nowcoder API response envelope: it requires a record with a boolean success and a safe-integer code. When the envelope is well-formed but success is false or code is non-zero — and the code is not 999 / the message does not indicate a login problem — it throws this CommandExecutionError carrying the server-provided msg and code. It is the generic 'Nowcoder API rejected the request' error.
Source
Thrown at clis/nowcoder/posts.js:257
let payload;
try {
await page.goto('https://www.nowcoder.com');
payload = await page.fetchJson(url, options);
}
catch (error) {
const detail = String(error?.message ?? error);
if (/HTTP\s+(401|403)|need login|not logged in/i.test(detail)) {
throw new AuthRequiredError('nowcoder.com', `${label} requires a logged-in Nowcoder session`);
}
throw new CommandExecutionError(`${label} failed: ${detail}`);
}
if (!isRecord(payload) || typeof payload.success !== 'boolean' || !Number.isSafeInteger(payload.code)) throw new CommandExecutionError(`${label} returned a malformed envelope`);
const message = typeof payload.msg === 'string' ? payload.msg : 'unknown error';
if (!payload.success || payload.code !== 0) {
if (payload.code === 999 || /need login|登录/i.test(message)) {
throw new AuthRequiredError('nowcoder.com', `${label} requires a logged-in Nowcoder session: ${message}`);
}
throw new CommandExecutionError(`${label} failed: ${message} (${payload.code})`);
}
if (!isRecord(payload.data)) throw new CommandExecutionError(`${label} returned malformed data`);
return payload.data;
}
View on GitHub (pinned to 49907e53dc)
Solutions
- Read the code and msg in the error message and check Nowcoder API semantics for that code
- Retry after a delay — many non-zero codes are transient rate limiting
- Log in to nowcoder.com in the driving browser session in case the code is auth-adjacent (code 999 is diverted to AuthRequiredError)
- If persistent, inspect clis/nowcoder/posts.js and verify the endpoint URL/body still match the current Nowcoder API
Example fix
// before
const data = await fetchNowcoderData(page, url, opts);
// after
let data;
try {
data = await fetchNowcoderData(page, url, opts);
} catch (e) {
if (e instanceof CommandExecutionError && /\(4\d\d\)$/.test(e.message)) {
await sleep(2000);
data = await fetchNowcoderData(page, url, opts);
} else throw e;
} Defensive patterns
Strategy: try-catch
Validate before calling
function checkEnvelope(p){ if (p && typeof p === 'object' && typeof p.success === 'boolean' && Number.isSafeInteger(p.code)) return p; throw new Error('malformed envelope'); } Type guard
function isEnvelope(p){ return !!p && typeof p === 'object' && typeof p.success === 'boolean' && Number.isSafeInteger(p.code); } Try / catch
try { const data = await fetchNowcoderData(page, url, opts); }
catch (e) {
if (e instanceof AuthRequiredError) { /* prompt login */ }
else if (e instanceof CommandExecutionError) { console.error('Nowcoder API rejected:', e.message); /* retry or degrade */ }
else throw e;
} Prevention
- Log in to nowcoder.com in the automated browser session before scraping
- Back off and retry on non-zero codes; many are transient rate limits
- Monitor Nowcoder API changes and pin/verify endpoint behavior periodically
- Treat error codes in the message as the source of truth for diagnosis
When it happens
Trigger: Calling any nowcoder CLI subcommand (via fetchNowcoderData, used by data) while the remote endpoint replies { success:false, code: N } with N !== 999, e.g. rate limiting, invalid parameters, endpoint changes, or transient server errors.
Common situations: Nowcoder changes its gateway API (code semantics shift); the request is throttled during heavy scraping; a wrong endpoint URL or POST body shape yields a non-zero business code; server-side incidents return success:false.
Related errors
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/0a37cd95a9662c19.
Report an issue: GitHub.