ToolJet/ToolJet · error · Error
No component ID provided for control-component action.
Error message
No component ID provided for control-component action.
What it means
The catch in buildTestConnection() for the direct (non-SSH) single-connection path. This wraps actual connection establishment failures from mariadb.createConnection(). Unlike the pool catches (633/634), this fires on real connection errors because createConnection() connects immediately: wrong host/port, authentication failure, TLS mismatch, or network unreachable.
Source
Thrown at frontend/src/AppBuilder/_stores/slices/eventsSlice.js:953
const { getComponentDefinition } = get();
// let component = Object.values(getCurrentState()?.components ?? {}).filter(
// (component) => component.id === event.componentId
// )[0];
if (!event.componentSpecificActionHandle) {
throw new Error('No component-specific action handle provided.');
}
const componentDefinition = getComponentDefinition(event.componentId, moduleId);
const componentName = componentDefinition?.component?.name;
const parent = componentDefinition?.component?.parent;
const parentDefinition = getComponentDefinition(parent, moduleId);
const parentType = parentDefinition?.component?.component;
let component = getExposedValueOfComponent(event.componentId, moduleId);
if (parentType === 'Form' && componentName) {
component = getExposedValueOfComponent(parent, moduleId)?.children?.[componentName];
}
if (!event.componentId || !Object.keys(component).length) {
throw new Error('No component ID provided for control-component action.');
}
const action = component?.[event.componentSpecificActionHandle];
// let action = '';
// let actionArguments = '';
// check if component id not found then try to find if its available as child widget else continue
// with normal flow finding action
// if (component == undefined) {
// component = _ref.appDefinition.pages[getCurrentState()?.page?.id].components[event.componentId].component;
// const parent = Object.values(getCurrentState()?.components ?? {}).find(
// (item) => item.id === component.parent
// );
// const child = Object.values(parent?.children).find((item) => item.id === event.componentId);
// if (child) {
// action = child[event.componentSpecificActionHandle];
// }
// } else {
// //normal component outside a container ex : form
// action = component?.[event.componentSpecificActionHandle];View on GitHub (pinned to 20602a8e10)
Solutions
- Verify host and port are correct and reachable from the ToolJet server: `telnet <host> <port>` or `nc -zv <host> <port>`.
- Test credentials with a MariaDB client: `mysql -h <host> -P <port> -u <user> -p<password>`.
- If the server requires SSL, set sourceOptions.ssl_enabled and configure the certificate type (ca_certificate or self_signed).
- Ensure the MariaDB server's bind-address allows connections from the ToolJet server's IP.
- Check cloud security groups / firewall rules permit inbound traffic on the database port.
Defensive patterns
Strategy: try-catch
Validate before calling
function validateDirectConnectionConfig(sourceOptions) {
if (!sourceOptions.host) return { valid: false, reason: 'host is required' };
if (!sourceOptions.port) return { valid: false, reason: 'port is required' };
if (!sourceOptions.user) return { valid: false, reason: 'user is required' };
if (!sourceOptions.database) return { valid: false, reason: 'database is required' };
return { valid: true };
} Try / catch
try {
await mariadb.testConnection(sourceOptions);
} catch (e) {
if (e instanceof QueryError) {
const msg = e.data || e.message;
if (/access denied/i.test(msg)) { /* wrong credentials */ }
if (/unknown database/i.test(msg)) { /* wrong database name */ }
if (/ECONNREFUSED|ENOTFOUND|ETIMEDOUT/i.test(msg)) { /* network/firewall issue */ }
if (/ssl|tls/i.test(msg)) { /* SSL mismatch — toggle ssl_enabled */ }
}
throw e;
} Prevention
- Test connectivity from the ToolJet server: `nc -zv <host> <port>` before configuring.
- Verify credentials with `mysql -h <host> -P <port> -u <user> -p`.
- Match SSL settings to the server's requirements (ssl_enabled + certificate type).
- Ensure cloud security groups / firewalls allow inbound traffic on the database port from the ToolJet server's IP.
- Check that the MariaDB server's bind-address permits remote connections if the ToolJet server is on a different host.
When it happens
Trigger: Triggered when the MariaDB server is unreachable (wrong host/port, firewall, DNS failure), authentication fails (wrong user/password), the database name doesn't exist, or the SSL/TLS configuration doesn't match the server's requirements.
Common situations: The most common datasource setup error. Happens with typos in host/port, wrong credentials, server not configured to accept remote connections (bind-address), SSL required by server but not configured in client, or firewall/network ACLs blocking the port.
Related errors
- No application selected
- No component-specific action handle provided.
- Connection could not be established
- Cannot connect to host: ${error.message}
- No query selected
AI-assisted analysis of ToolJet/ToolJet@20602a8e10 (2026-08-13).
Data as JSON: /api/errors/b8cf53a43e995b1d.
Report an issue: GitHub.