You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					62 lines
				
				1.9 KiB
			
		
		
			
		
	
	
					62 lines
				
				1.9 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								/*!
							 | 
						||
| 
								 | 
							
								 * Module dependencies.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const MongooseError = require('./mongooseError');
							 | 
						||
| 
								 | 
							
								const allServersUnknown = require('../helpers/topology/allServersUnknown');
							 | 
						||
| 
								 | 
							
								const isAtlas = require('../helpers/topology/isAtlas');
							 | 
						||
| 
								 | 
							
								const isSSLError = require('../helpers/topology/isSSLError');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*!
							 | 
						||
| 
								 | 
							
								 * ignore
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const atlasMessage = 'Could not connect to any servers in your MongoDB Atlas cluster. ' +
							 | 
						||
| 
								 | 
							
								  'One common reason is that you\'re trying to access the database from ' +
							 | 
						||
| 
								 | 
							
								  'an IP that isn\'t whitelisted. Make sure your current IP address is on your Atlas ' +
							 | 
						||
| 
								 | 
							
								  'cluster\'s IP whitelist: https://docs.atlas.mongodb.com/security-whitelist/';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const sslMessage = 'Mongoose is connecting with SSL enabled, but the server is ' +
							 | 
						||
| 
								 | 
							
								  'not accepting SSL connections. Please ensure that the MongoDB server you are ' +
							 | 
						||
| 
								 | 
							
								  'connecting to is configured to accept SSL connections. Learn more: ' +
							 | 
						||
| 
								 | 
							
								  'https://mongoosejs.com/docs/tutorials/ssl.html';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class MongooseServerSelectionError extends MongooseError {
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * MongooseServerSelectionError constructor
							 | 
						||
| 
								 | 
							
								   *
							 | 
						||
| 
								 | 
							
								   * @api private
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  assimilateError(err) {
							 | 
						||
| 
								 | 
							
								    const reason = err.reason;
							 | 
						||
| 
								 | 
							
								    // Special message for a case that is likely due to IP whitelisting issues.
							 | 
						||
| 
								 | 
							
								    const isAtlasWhitelistError = isAtlas(reason) &&
							 | 
						||
| 
								 | 
							
								      allServersUnknown(reason) &&
							 | 
						||
| 
								 | 
							
								      err.message.indexOf('bad auth') === -1 &&
							 | 
						||
| 
								 | 
							
								      err.message.indexOf('Authentication failed') === -1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (isAtlasWhitelistError) {
							 | 
						||
| 
								 | 
							
								      this.message = atlasMessage;
							 | 
						||
| 
								 | 
							
								    } else if (isSSLError(reason)) {
							 | 
						||
| 
								 | 
							
								      this.message = sslMessage;
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      this.message = err.message;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    for (const key in err) {
							 | 
						||
| 
								 | 
							
								      if (key !== 'name') {
							 | 
						||
| 
								 | 
							
								        this[key] = err[key];
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return this;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Object.defineProperty(MongooseServerSelectionError.prototype, 'name', {
							 | 
						||
| 
								 | 
							
								  value: 'MongooseServerSelectionError'
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = MongooseServerSelectionError;
							 |