appsmithorg/appsmith · error · PluginActionExecutionError
${extractExecutionErrorMessage(e)}
Error message
${extractExecutionErrorMessage(e)} What it means
Terminal fallback thrown by the file-upload branch of executePluginActionSaga. After the saga has ruled out a client-side validation error and a user cancellation, any remaining exception is wrapped in a PluginActionExecutionError whose message comes from extractExecutionErrorMessage(). That helper normalises Axios transport errors (timeout, network error), server envelopes from validateResponse, and falls back to 'Response not valid', so the original raw upstream body or credentials are never surfaced. The second constructor arg is false, marking this as a genuine failure rather than a user cancel.
Source
Thrown at app/client/src/sagas/ActionExecution/PluginActionSaga.ts:1571
throw new UserCancelledActionExecutionError();
}
// In case there is no response from server and files are being uploaded
// we report it as INVALID_RESPONSE. The server didn't send any code or the
// request was cancelled due to timeout
if (filePickerInstrumentation.numberOfFiles > 0) {
triggerFileUploadInstrumentation(
filePickerInstrumentation,
"INVALID_RESPONSE",
"444",
pluginAction.name,
pluginAction.pluginType,
"NA",
);
}
throw new PluginActionExecutionError(
extractExecutionErrorMessage(e),
false,
);
}
}
// Function to send the file upload event to segment
function triggerFileUploadInstrumentation(
// TODO: Fix this the next time the file is edited
// eslint-disable-next-line @typescript-eslint/no-explicit-any
filePickerInfo: Record<string, any>,
status: string,
statusCode: string,
pluginName: string,
pluginType: string,
timeTaken: string,
) {
const { fileSizes, fileTypes, numberOfFiles, totalSize } = filePickerInfo;View on GitHub (pinned to 8cd9021c24)
Solutions
- If the toast reads 'Action execution timed out', increase the action's timeout-in-settings or split the upload into smaller chunks.
- Open the browser Network panel and confirm the request reaches the Appsmith server (no DNS/CORS/502); check the response status and body the server returned.
- Verify the datasource configuration (base URL, auth, headers) still matches the upstream API contract.
- If a proxy/gateway sits in front of the server, raise its max body size and read timeout (e.g. nginx client_max_body_size, proxy_read_timeout).
- Check server logs for the request id to see whether the plugin itself rejected the upload.
Example fix
// In the API action settings, raise the timeout // before: action timeout = 10000ms (default) // after: action timeout = 60000ms // // nginx (if a 413 / truncated response is the cause): // before: client_max_body_size 1m; // after: client_max_body_size 50m;
Defensive patterns
Strategy: try-catch
Validate before calling
// Before triggering an upload action, sanity-check the inputs
if (!file || file.size > MAX_BYTES) {
showAlert('File too large or missing', 'error');
return;
} Type guard
function isPluginActionExecutionError(e: unknown): e is PluginActionExecutionError {
return e instanceof Error && e.name === 'PluginActionExecutionError';
} Try / catch
try {
await runPluginAction({ ... });
} catch (e) {
if (e instanceof Error && e.name === 'UserCancelledActionExecutionError') return;
// PluginActionExecutionError: surface the normalised message
showAlert(e?.message ?? 'Upload failed', 'error');
} Prevention
- Validate file size and type in a JS object before calling the upload action.
- Keep action timeout aligned with the largest expected upload.
- Confirm datasource base URL and CORS headers before going live.
When it happens
Trigger: A plugin action that uploads files returns a non-2xx response, hits Axios' request timeout, suffers a network failure, or returns a payload that fails validateResponse. It also fires when the server closes the connection mid-upload (instrumentation logs status INVALID_RESPONSE / 444).
Common situations: Action timeout in settings too low for large uploads; datasource base URL wrong or down; CORS preflight rejected; file exceeds server max body size; plugin response schema changed after a backend upgrade; reverse proxy (nginx/cloudfront) truncating long uploads.
Related errors
- Save page failed
- Failed to load JS libraries
- Unable to fetch newly created actions
- Failed importing template
- The script at ${url} cannot be installed.
AI-assisted analysis of appsmithorg/appsmith@8cd9021c24 (2026-08-12).
Data as JSON: /api/errors/c9c9641766b23601.
Report an issue: GitHub.