MongoDB连接报错:已设置useNewUrlParser仍提示密码包含未转义字符
报错原因
Password contains unescaped characters 报错的核心是MongoDB连接字符串的密码段包含URL规范中的保留字符(如@、:、/、?、#、空格等)。useNewUrlParser: true仅负责切换URL解析引擎,不会自动对密码中的特殊字符做转义处理,因此配置后依然会触发报错。
解决方案
- 方案1:手动转义特殊字符
将密码中的保留字符替换为对应的百分号编码,常见对应关系如下:
| 特殊字符 | 编码值 |
|---|---|
| @ | %40 |
| : | %3A |
| / | %2F |
| ? | %3F |
| # | %23 |
| 空格 | %20 |
比如原密码为abc@123#xyz,转义后为abc%40123%23xyz,替换到.env文件的MONGO_URL密码段即可。
- 方案2:使用内置方法自动编码(推荐)
调用Node.js内置的encodeURIComponent方法自动处理密码转义,避免手动替换遗漏。修改你的连接代码如下:
const express = require("express"); const app = express(); const mongoose = require("mongoose"); const dotenv = require("dotenv"); dotenv.config(); connectDB().catch(err => console.log(err)); async function connectDB() { // 解析连接字符串,单独对密码做转义处理 const mongoConnUrl = new URL(process.env.MONGO_URL); mongoConnUrl.password = encodeURIComponent(mongoConnUrl.password); await mongoose.connect(mongoConnUrl.toString(), { useNewUrlParser: true, }) .then(() => console.log("DB Connection Success")) .catch((err) => console.log(err)); } app.listen(8800, () => { console.log("Backend Server is running"); });
- 方案3:拆分连接参数传入
直接将连接参数拆分为独立配置项传入,无需拼接URL,从根源避免转义问题。需要将.env中的连接信息拆分为单独的用户名、密码、地址、库名等变量:
await mongoose.connect({ user: process.env.MONGO_USER, pass: process.env.MONGO_PASS, host: process.env.MONGO_HOST, port: process.env.MONGO_PORT || 27017, dbName: process.env.MONGO_DB_NAME, useNewUrlParser: true })
注意事项
如果.env文件中MONGO_URL的首尾加了单引号或双引号,请先删除引号,否则引号会被识别为密码的一部分,也会触发该报错。
内容的提问来源于stack exchange,提问作者Daniel Kwame Amissah
相关产品推荐
相关产品推荐

