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
- Build read preferences via `ReadPreference.fromString(mode)` and check `ReadPreference.isValid(mode)` first.
- Validate user-supplied mode strings against the known set before constructing a ReadPreference.
- 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
- Call ReadPreference.isValid(mode) before constructing from external input.
- Prefer ReadPreference.fromString for string inputs.
- Do not mutate an existing ReadPreference.mode.
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
- Option "readPreference" must be a ReadPreference instance
- Invalid read preference mode ${JSON.stringify(mode)}
- ReadPreference tags must be an array
- maxStalenessSeconds must be a positive integer
- Primary read preference cannot be combined with tags
AI-assisted analysis of mongodb/node-mongodb-native@3366c21a63 (2026-08-04).
Data as JSON: /data/errors/cccdfec9bad54362.json.
Report an issue: GitHub.