pot-app/pot-desktop · error · Error
${result['message']}
Error message
${result['message']} What it means
In the aliyun backup `list` function, when the openFile/list API returns a non-2xx status AND the response body contains a `message` field, that server-provided message is thrown verbatim. This surfaces the actual Aliyun Drive API error (auth, permission, parameter problems) directly to the caller.
Source
Thrown at src/window/Config/pages/Backup/utils/aliyun.jsx:56
drive_id,
parent_file_id: dir_id,
type: 'file',
order_by: 'name',
}),
});
if (res.ok) {
const result = res.data;
if (result['items']) {
return result['items'].map((item) => {
return item['name'];
});
} else {
throw new Error(`Get File List Error: ${JSON.stringify(result)}`);
}
} else {
const result = res.data;
if (result['message']) {
throw new Error(result['message']);
} else {
throw new Error(`Get accessToken Error: ${JSON.stringify(result)}`);
}
}
}
export async function get(token, name) {
const drive_id = await driveId(token);
const file_id = await getFileByPath(token, drive_id, name);
const url = await getDownloadUrl(token, drive_id, file_id);
await invoke('aliyun', { operate: 'get', path: '', url });
}
export async function remove(token, name) {
const drive_id = await driveId(token);
const file_id = await getFileByPath(token, drive_id, name);
const res = await fetch('https://openapi.alipan.com/adrive/v1.0/openFile/delete', {
method: 'POST',View on GitHub (pinned to 594d32ede9)
Solutions
- If the message says the token is invalid/expired, redo the QR-code OAuth flow (qrcode() + status() + accessToken()) to get a fresh token.
- Check the message for scope/permission errors and re-authorize with the required scopes (user:base, file:all:read, file:all:write).
- Verify the token is actually stored in the backup config — an empty/undefined token yields 401.
- If the token is an old refresh token from a previous app version, re-link the account.
Defensive patterns
Strategy: try-catch
Validate before calling
function hasToken(config) {
return typeof config.aliyunToken === 'string' && config.aliyunToken.length > 20;
}
// before calling list():
if (!hasToken(backupConfig)) openRelinkFlow(); Type guard
function isAliyunApiError(body) {
return body != null && typeof body === 'object' && typeof body.message === 'string';
} Try / catch
try {
const names = await list(token);
} catch (e) {
const msg = String(e.message);
if (/AccessToken.*(Invalid|Expired)|401/i.test(msg)) {
await reauthorizeAliyun(); // qrcode -> status -> accessToken flow
} else {
throw e;
}
} Prevention
- Refresh the alipan access token proactively — access tokens are short-lived
- Detect 401 messages globally and trigger the QR re-login flow automatically
- Store and rotate the refresh token so sessions can be renewed silently
- Confirm all required scopes were granted during OAuth (file read/write + user:base)
When it happens
Trigger: list(token) receives an HTTP error response from https://openapi.alipan.com/adrive/v1.0/openFile/list whose body has a `message` field — e.g. 401 AccessTokenInvalid/AccessTokenExpired, 403 permission denied, 400 bad drive_id.
Common situations: The saved alipan OAuth access token expired (they are short-lived), the token was revoked after re-login, or the app lost the file:all:read scope needed to list files.
Related errors
- Can not find qrCodeUrl: ${JSON.stringify(result)}
- Get File List Error: ${JSON.stringify(result)}
- Get accessToken Error: ${JSON.stringify(result)}
- Get QrCode Error: ${JSON.stringify(result)}
- Can not find status: ${JSON.stringify(result)}
AI-assisted analysis of pot-app/pot-desktop@594d32ede9 (2026-09-02).
Data as JSON: /api/errors/efb23ab792892336.
Report an issue: GitHub.