mongodb/node-mongodb-native · error · MongoInvalidArgumentError

Invalid read preference specified

Error message

Invalid read preference specified

What it means

Thrown by `readPreferenceServerSelector` when `readPreference.isValid()` returns false (server_selection.ts:384). `isValid` checks that the mode is one of the five recognized strings (or null). Unlike the constructor, the selector re-validates, so an invalidly-constructed ReadPreference is caught here at selection time.

Source

Thrown at src/sdam/server_selection.ts:385

    }

    default: {
      const _exhaustiveCheck: never = mode;
      throw new MongoRuntimeError(
        `unexpected readPreference=${mode} (should never happen).  Please report a bug in the Node driver Jira project.`
      );
    }
  }
}

/**
 * Returns a function which selects servers based on a provided read preference
 *
 * @param readPreference - The read preference to select with
 */
export function readPreferenceServerSelector(readPreference: ReadPreference): ServerSelector {
  if (!readPreference.isValid()) {
    throw new MongoInvalidArgumentError('Invalid read preference specified');
  }

  return function readPreferenceServers(
    topologyDescription: TopologyDescription,
    servers: ServerDescription[],
    deprioritized: DeprioritizedServers
  ): ServerDescription[] {
    switch (topologyDescription.type) {
      case 'Single':
        return latencyWindowReducer(topologyDescription, servers.filter(knownFilter));
      case 'ReplicaSetNoPrimary':
      case 'ReplicaSetWithPrimary':
        return secondarySelector(readPreference, topologyDescription, servers, deprioritized);
      case 'Sharded': {
        const selectable = filterDeprioritized(servers, deprioritized);
        return latencyWindowReducer(topologyDescription, selectable.filter(knownFilter));
      }
      case 'Unknown':

View on GitHub (pinned to 3366c21a63)

Solutions

  1. Build read preferences via `ReadPreference.fromString(mode)` and check `ReadPreference.isValid(mode)` first.
  2. Validate user-supplied mode strings against the known set before constructing a ReadPreference.
  3. Avoid mutating an existing ReadPreference instance's mode field.

Example fix

// before
const rp = new ReadPreference('secndary'); // typo, not validated
find({}, { readPreference: rp });
// after
const mode = ReadPreference.isValid('secondary') ? 'secondary' : 'primary';
find({}, { readPreference: new ReadPreference(mode) });
Defensive patterns

Strategy: validation

Validate before calling

function buildReadPref(mode) {
  if (!ReadPreference.isValid(mode)) throw new TypeError('Invalid read preference mode: ' + mode);
  return new ReadPreference(mode);
}

Type guard

function isValidReadPref(mode) {
  return ReadPreference.isValid(mode);
}

Prevention

When it happens

Trigger: Constructing `new ReadPreference('whatever')` (the constructor does not validate mode) and then running an operation that triggers server selection; passing a ReadPreference whose mode was mutated after construction.

Common situations: Assuming the constructor validates mode; building a ReadPreference from untrusted input without validation; typos in mode strings.

Related errors


AI-assisted analysis of mongodb/node-mongodb-native@3366c21a63 (2026-08-04). Data as JSON: /data/errors/cccdfec9bad54362.json. Report an issue: GitHub.