cube-js/cube · error · Error

is required

Error message

${type} is required

What it means

The Dev Server's /playground/test-connection endpoint resolves the env variable name that must hold the database type (CUBEJS_DB_TYPE, or CUBEJS_DS_<dataSource>_DB_TYPE for multiple data sources) via keyByDataSource, then requires the submitted `variables` object to contain a value for that key. If the variables map is missing/empty or lacks that key, it throws `${type} is required` before attempting to instantiate and test the driver. Cube needs the db type to know which driver package to load and which env keys to read.

Solutions

  1. Include the database type in the request variables, e.g. { variables: { CUBEJS_DB_TYPE: 'postgres', ... } }
  2. For multiple data sources, send the dataSource-specific key, e.g. { variables: { CUBEJS_DS_MYDS_DB_TYPE: 'mysql' } } together with dataSource in the body
  3. Fix the client/UI to always populate the db type field before calling the endpoint
  4. Set CUBEJS_DB_TYPE in the environment as a baseline so tooling can default to it

Example fix

// before
curl -X POST /playground/test-connection -d '{"variables":{"CUBEJS_DB_HOST":"localhost"}}'
// after
curl -X POST /playground/test-connection -d '{"variables":{"CUBEJS_DB_TYPE":"postgres","CUBEJS_DB_HOST":"localhost"}}'
Defensive patterns

Strategy: validation

Validate before calling

async function testConnectionSafe(body) {
  const { dataSource, variables } = body || {};
  const type = dataSource ? `CUBEJS_DS_${dataSource.toUpperCase()}_DB_TYPE` : 'CUBEJS_DB_TYPE';
  if (!variables || !variables[type]) {
    throw new Error(`${type} is required by /playground/test-connection`);
  }
  return fetch('/playground/test-connection', { method: 'POST', body: JSON.stringify(body) });
}

Type guard

function hasDbTypeVariables(v) {
  return typeof v === 'object' && v !== null && typeof v.CUBEJS_DB_TYPE === 'string' && v.CUBEJS_DB_TYPE.length > 0;
}

Try / catch

try {
  const res = await fetch('/playground/test-connection', {...});
  if (!res.ok) throw new Error((await res.json()).error);
} catch (e) {
  if (/DB_TYPE is required/.test(String(e))) {
    // prompt the user to pick a database type before retrying
  }
}

Prevention

When it happens

Trigger: POSTing to /playground/test-connection with a body whose `variables` is undefined, or variables lacking the key 'CUBEJS_DB_TYPE' (or 'CUBEJS_DS_<ds>_DB_TYPE' when a dataSource is passed and multiple data sources are enabled). This happens from the Developer Playground 'Test connection' UI when the database type field was not filled in.

Common situations: Using the Playground's connection-test form without selecting a database type; custom tooling calling the endpoint without the variables payload; multi-data-source setups where the request omits the per-data-source DB type variable; typos in the env variable key sent by the client.

Understand the failure class

Background: "environment variable is not set" and "Missing keys in environment" errors: what missing required env var messages mean and how to fix them — this error's family across 28 libraries.

Related errors


AI-assisted analysis of cube-js/cube@7d981676b3 (2026-09-02). Data as JSON: /api/errors/f91adf1aaa8be2d2. Report an issue: GitHub.

Appendix: source

Thrown at packages/cubejs-server-core/src/core/DevServer.ts:508

          [env: string]: string,
        },
      },
    };

    app.post('/playground/test-connection', catchErrors(
      async (req: TestConnectionRequest, res) => {
        const { dataSource, variables } = req.body || {};

        // With multiple data sources enabled, we need to use
        // CUBEJS_DS_<dataSource>_DB_TYPE environment variable
        // instead of CUBEJS_DB_TYPE.
        const type = keyByDataSource('CUBEJS_DB_TYPE', dataSource);

        let driver: BaseDriver | null = null;

        try {
          if (!variables || !variables[type]) {
            throw new Error(`${type} is required`);
          }

          // Backup env variables and set new ones in-place.
          // We must mutate the existing process.env object (not replace it)
          // because env-var holds a reference to the original object.
          const backup: Record<string, string | undefined> = {};

          for (const [envName, envValue] of Object.entries(variables)) {
            backup[envName] = process.env[envName];
            process.env[envName] = <string>envValue;
          }

          // With multiple data sources enabled, we need to put the dataSource
          // parameter to the driver instance to read an appropriate set of
          // driver configuration parameters. It can be undefined if multiple
          // data source is disabled.
          driver = CubejsServerCore.createDriver(
            <DatabaseType>variables[type],

View on GitHub (pinned to 7d981676b3)