| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- 'use strict';
- const clone = require('./clone');
- const MongooseError = require('../error/index');
- function processConnectionOptions(uri, options) {
- const opts = options ? options : {};
- const readPreference = opts.readPreference
- ? opts.readPreference
- : getUriReadPreference(uri);
- const clonedOpts = clone(opts);
- const resolvedOpts = (readPreference && readPreference !== 'primary' && readPreference !== 'primaryPreferred')
- ? resolveOptsConflicts(readPreference, clonedOpts)
- : clonedOpts;
- return resolvedOpts;
- }
- function resolveOptsConflicts(pref, opts) {
- // don't silently override user-provided indexing options
- if (setsIndexOptions(opts) && setsSecondaryRead(pref)) {
- throwReadPreferenceError();
- }
- // if user has not explicitly set any auto-indexing options,
- // we can silently default them all to false
- else {
- return defaultIndexOptsToFalse(opts);
- }
- }
- function setsIndexOptions(opts) {
- const configIdx = opts.config?.autoIndex;
- const { autoCreate, autoIndex } = opts;
- return !!(configIdx || autoCreate || autoIndex);
- }
- function setsSecondaryRead(prefString) {
- return !!(prefString === 'secondary' || prefString === 'secondaryPreferred');
- }
- function getUriReadPreference(connectionString) {
- const exp = /(?:&|\?)readPreference=(\w+)(?:&|$)/;
- const match = exp.exec(connectionString);
- return match ? match[1] : null;
- }
- function defaultIndexOptsToFalse(opts) {
- opts.config = { autoIndex: false };
- opts.autoCreate = false;
- opts.autoIndex = false;
- return opts;
- }
- function throwReadPreferenceError() {
- throw new MongooseError(
- 'MongoDB prohibits index creation on connections that read from ' +
- 'non-primary replicas. Connections that set "readPreference" to "secondary" or ' +
- '"secondaryPreferred" may not opt-in to the following connection options: ' +
- 'autoCreate, autoIndex'
- );
- }
- module.exports = processConnectionOptions;
|