jackwener/OpenCLI · error · CommandExecutionError
Zhihu answer detail returned an error payload: ${data.error?
Error message
Zhihu answer detail returned an error payload: ${data.error?.message || data.error_msg || data.message} What it means
This CommandExecutionError is thrown when the response object explicitly signals an application-level error: it contains an `error` object, `error_msg`, or `message` field. The first available message (data.error?.message, else data.error_msg, else data.message) is embedded in the thrown error, surfacing Zhihu's own error text to the developer.
Source
Thrown at clis/zhihu/answer-detail.js:119
? `Zhihu answer detail request failed (HTTP ${status})`
: 'Zhihu answer detail request failed',
'Try again later or rerun with -v for more detail',
);
}
if (data.__malformedJson) {
throw new CommandExecutionError(
`Zhihu answer detail returned malformed JSON: ${data.__malformedJson}`,
'Try again later or rerun with -v for more detail',
);
}
if (typeof data !== 'object' || Array.isArray(data)) {
throw new CommandExecutionError(
'Zhihu answer detail returned a malformed payload',
'Try again later or rerun with -v for more detail',
);
}
if (data.error || data.error_msg || data.message) {
throw new CommandExecutionError(
`Zhihu answer detail returned an error payload: ${data.error?.message || data.error_msg || data.message}`,
'Try again later or rerun with -v for more detail',
);
}
if (!Object.prototype.hasOwnProperty.call(data, 'content')) {
throw new CommandExecutionError(
'Zhihu answer detail payload did not include answer content',
'Try again later or rerun with -v for more detail',
);
}
const question = data.question || {};
// Answer ids and newer question ids can exceed
// Number.MAX_SAFE_INTEGER. Prefer ids parsed from user input or
// the canonical redirected URL; only fall back to API numeric ids
// when no string-safe source is available.
const questionId = target.questionId
|| currentQuestionId
|| extractQuestionIdFromAnswerUrl(question.url)View on GitHub (pinned to 49907e53dc)
Solutions
- Read the embedded Zhihu error message to identify the specific cause and act on it.
- Re-login or use an account with access to the requested answer if it is permission-related.
- Retry later if the message suggests a transient server-side condition.
- Rerun with -v for full payload context.
Defensive patterns
Strategy: try-catch
Type guard
function hasApiErrorField(d) { return !!(d && typeof d === 'object' && (d.error || d.error_msg || d.message)); } Try / catch
try {
const detail = await answerDetail(id);
} catch (err) {
const m = err.message.match(/error payload: (.+)$/);
if (m) {
console.error(`Zhihu said: ${m[1]}`); // act on Zhihu's own message
return null;
}
throw err;
} Prevention
- Parse and log the embedded Zhihu message to distinguish permission vs. transient issues.
- Re-login when messages indicate session or permission problems.
- Skip answers whose error messages indicate policy restriction instead of retrying.
- Back off when messages suggest server-side load.
When it happens
Trigger: The fetched JSON object has a truthy data.error, data.error_msg, or data.message — Zhihu processed the request but returned an API-level error (e.g. account restriction, content removed, permission denial) with HTTP 200.
Common situations: Answer content restricted by Zhihu policy, account-level API limits, session recognized but not authorized for that content, or Zhihu soft-error responses that still use HTTP 200.
Related errors
- Zhihu ${label} returned an error payload: ${payload.__errorM
- COMMAND_EXEC
- Zhihu answer download returned a malformed Browser Bridge pa
- ${probe.detail}
- ${label} returned an unexpected payload shape; expected an o
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/0a59e682bf7de1f5.
Report an issue: GitHub.