12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- '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 resolvedOpts = (readPreference && readPreference !== 'primary' && readPreference !== 'primaryPreferred')
- ? resolveOptsConflicts(readPreference, opts)
- : opts;
- return clone(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 && 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;
|