{"record":{"id":"2d1d6f7bc7eb8110","repo":"mongodb/node-mongodb-native","slug":"can-only-specify-both-of-proxy-username-password-o","errorCode":null,"errorMessage":"Can only specify both of proxy username/password or neither","messagePattern":"Can only specify both of proxy username/password or neither","errorType":"exception","errorClass":"MongoParseError","httpStatus":null,"severity":"error","filePath":"src/connection_string.ts","lineNumber":515,"sourceCode":"    }\n  }\n\n  if (mongoOptions.directConnection && mongoOptions.hosts.length !== 1) {\n    throw new MongoParseError('directConnection option requires exactly one host');\n  }\n\n  if (\n    !mongoOptions.proxyHost &&\n    (mongoOptions.proxyPort || mongoOptions.proxyUsername || mongoOptions.proxyPassword)\n  ) {\n    throw new MongoParseError('Must specify proxyHost if other proxy options are passed');\n  }\n\n  if (\n    (mongoOptions.proxyUsername && !mongoOptions.proxyPassword) ||\n    (!mongoOptions.proxyUsername && mongoOptions.proxyPassword)\n  ) {\n    throw new MongoParseError('Can only specify both of proxy username/password or neither');\n  }\n\n  const proxyOptions = ['proxyHost', 'proxyPort', 'proxyUsername', 'proxyPassword'].map(\n    key => urlOptions.get(key) ?? []\n  );\n\n  if (proxyOptions.some(options => options.length > 1)) {\n    throw new MongoParseError(\n      'Proxy options cannot be specified multiple times in the connection string'\n    );\n  }\n\n  mongoOptions.mongoLoggerOptions = MongoLogger.resolveOptions(\n    {\n      MONGODB_LOG_COMMAND: process.env.MONGODB_LOG_COMMAND,\n      MONGODB_LOG_TOPOLOGY: process.env.MONGODB_LOG_TOPOLOGY,\n      MONGODB_LOG_SERVER_SELECTION: process.env.MONGODB_LOG_SERVER_SELECTION,\n      MONGODB_LOG_CONNECTION: process.env.MONGODB_LOG_CONNECTION,","sourceCodeStart":497,"sourceCodeEnd":533,"githubUrl":"https://github.com/mongodb/node-mongodb-native/blob/dce7939f86fb283e167ad709955abedb7bf23124/src/connection_string.ts#L497-L533","documentation":"Thrown by MongoParseError at src/connection_string.ts:515 when exactly one of `proxyUsername` / `proxyPassword` is set. SOCKS5 auth requires both halves (or neither, for an unauthenticated proxy).","triggerScenarios":"Options `{ proxyHost: 'p', proxyUsername: 'u' }` (no password), or `{ proxyHost: 'p', proxyPassword: 'x' }` (no username).","commonSituations":"Loading the proxy password from an env var that is empty in one environment; mis-typing one of the two option keys.","solutions":["Provide both `proxyUsername` and `proxyPassword` together.","If the proxy needs no auth, remove both `proxyUsername` and `proxyPassword`."],"exampleFix":"// before\nnew MongoClient('mongodb://host:27017/', { proxyHost: 'p', proxyPort: 1080, proxyUsername: 'u' })\n\n// after\nnew MongoClient('mongodb://host:27017/', { proxyHost: 'p', proxyPort: 1080, proxyUsername: 'u', proxyPassword: process.env.PROXY_PASS })","handlingStrategy":"validation","validationCode":"function assertProxyCredsPaired(options = {}) {\n  const u = !!options.proxyUsername, p = !!options.proxyPassword;\n  if (u !== p) throw new Error('proxyUsername and proxyPassword must both be set or both omitted.');\n}","typeGuard":null,"tryCatchPattern":"try { new MongoClient(uri, options); } catch (e) { if (e instanceof MongoParseError && /both of proxy username\\/password/.test(e.message)) { /* add the missing half or drop both */ } else throw e; }","preventionTips":["Load proxyUsername and proxyPassword from the same secret/config source so they exist together.","Fail fast in a config validator that checks the XOR of the two fields."],"tags":["connection-string","proxy","socks","configuration","credentials"],"backgroundTag":null,"analyzedSha":"dce7939f86fb283e167ad709955abedb7bf23124","analyzedAt":"2026-08-11T04:54:53.215Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}