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

  1. Verify host and port are correct and reachable from the ToolJet server: `telnet <host> <port>` or `nc -zv <host> <port>`.
  2. Test credentials with a MariaDB client: `mysql -h <host> -P <port> -u <user> -p<password>`.
  3. If the server requires SSL, set sourceOptions.ssl_enabled and configure the certificate type (ca_certificate or self_signed).
  4. Ensure the MariaDB server's bind-address allows connections from the ToolJet server's IP.
  5. 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

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


AI-assisted analysis of ToolJet/ToolJet@20602a8e10 (2026-08-13). Data as JSON: /api/errors/b8cf53a43e995b1d. Report an issue: GitHub.