{"record":{"id":"816b63ab10fab843","repo":"mongodb/node-mongodb-native","slug":"all-values-of-tls-ssl-must-be-the-same","errorCode":null,"errorMessage":"All values of tls/ssl must be the same.","messagePattern":"All values of tls/ssl must be the same\\.","errorType":"exception","errorClass":"MongoParseError","httpStatus":null,"severity":"error","filePath":"src/connection_string.ts","lineNumber":356,"sourceCode":"\n  for (const key of allProvidedKeys) {\n    const values = [];\n    const objectOptionValue = objectOptions.get(key);\n    if (objectOptionValue != null) {\n      values.push(objectOptionValue);\n    }\n\n    const urlValues = urlOptions.get(key) ?? [];\n    values.push(...urlValues);\n    allProvidedOptions.set(key, values);\n  }\n\n  if (allProvidedOptions.has('tls') || allProvidedOptions.has('ssl')) {\n    const tlsAndSslOpts = (allProvidedOptions.get('tls') || [])\n      .concat(allProvidedOptions.get('ssl') || [])\n      .map(getBoolean.bind(null, 'tls/ssl'));\n    if (new Set(tlsAndSslOpts).size !== 1) {\n      throw new MongoParseError('All values of tls/ssl must be the same.');\n    }\n  }\n\n  checkTLSOptions(allProvidedOptions);\n\n  const unsupportedOptions = setDifference(\n    allProvidedKeys,\n    Array.from(Object.keys(OPTIONS)).map(s => s.toLowerCase())\n  );\n  if (unsupportedOptions.size !== 0) {\n    const optionWord = unsupportedOptions.size > 1 ? 'options' : 'option';\n    const isOrAre = unsupportedOptions.size > 1 ? 'are' : 'is';\n    throw new MongoParseError(\n      `${optionWord} ${Array.from(unsupportedOptions).join(', ')} ${isOrAre} not supported`\n    );\n  }\n\n  // Option parsing and setting","sourceCodeStart":338,"sourceCodeEnd":374,"githubUrl":"https://github.com/mongodb/node-mongodb-native/blob/dce7939f86fb283e167ad709955abedb7bf23124/src/connection_string.ts#L338-L374","documentation":"tls and ssl are aliases that must agree. The driver collects every value of tls and ssl (from both URI and options), coerces each through getBoolean, and requires the resulting set to have exactly one element. Conflicting values (e.g. tls=true with ssl=false) are rejected.","triggerScenarios":"A URI like 'mongodb://h/db?tls=true&ssl=false', or combining { tls: true } in options with 'ssl=false' in the URI, or 'tls=true&tls=false'.","commonSituations":"Migrating from ssl to tls terminology and leaving both set, or merging config layers (env var + code) that disagree.","solutions":["Use only tls (preferred) and remove ssl.","If both must appear, ensure they resolve to the same boolean."],"exampleFix":"// before\n'mongodb://h/db?tls=true&ssl=false'\n// after\n'mongodb://h/db?tls=true'","handlingStrategy":"validation","validationCode":"function assertTlsSslAgree(uri: string, opts: Record<string, unknown> = {}) {\n  const vals: boolean[] = [];\n  const q = new URLSearchParams(uri.split('?')[1] ?? '');\n  for (const k of ['tls', 'ssl']) {\n    if (q.has(k)) vals.push(q.get(k) === 'true');\n    if (opts[k] != null) vals.push(Boolean(opts[k]));\n  }\n  if (new Set(vals).size > 1) throw new Error('All tls/ssl values must agree');\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Standardize on 'tls' and remove all 'ssl' usage.","Avoid setting TLS both in the URI and in the options object."],"tags":["tls","connection-string","validation"],"backgroundTag":null,"analyzedSha":"dce7939f86fb283e167ad709955abedb7bf23124","analyzedAt":"2026-08-11T04:54:53.215Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}