You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

mongodb+srv URI提示不能包含端口号及密码转义相关问题求助

问题根因

你遇到的所有报错本质都是MongoDB连接URI的身份段解析错误导致的:

  1. MongoDB SRV连接URI的标准结构为 mongodb+srv://<用户名>:<密码>@<集群地址>/<数据库名>?<可选参数>,其中:是用户名和密码的分隔符,@是身份段和集群地址段的分隔符,二者都属于URI保留字符。
  2. 你的密码中包含@、:这类保留字符,未转义时会被解析器误判为分隔符:解析器会把密码中第一个@后面的内容识别为集群地址,里面的冒号会被当成端口号分隔符,因此抛出「mongodb+srv URI cannot have port number」错误。
  3. 你之前的转义操作存在两类错误:
    • 错误转义了用户名和密码之间的分隔冒号,导致解析器无法正确拆分用户名和密码,抛出认证失败错误
    • 没有完整转义密码中的所有保留字符,导致残留的特殊字符被误解析

正确处理方案

有两种可选方案,推荐优先用第二种,完全避开转义问题:

方案1:对密码做完整的百分号编码后拼接URI

首先对密码中的所有保留字符做转义:

  • 冒号:转义为%3A
  • 艾特@转义为%40
    假设你的原始账号信息为:
  • 用户名:smith_bob
  • 密码:smith_bob@hotmail.com:T@llyHo!:
    转义后的密码为:smith_bob%40hotmail.com%3AT%40llyHo!%3A
    拼接后的正确连接串为:
const CONNECTION_URL = "mongodb+srv://smith_bob:smith_bob%40hotmail.com%3AT%40llyHo!%3A@cluster0.r92qc.mongodb.net/myFirstDatabase?retryWrites=true&w=majority";
const PORT = process.env.PORT || 5000;

mongoose.connect(CONNECTION_URL,{useNewUrlParser: true, useUnifiedTopology: true})
    .then(()=>app.listen(PORT,()=> console.log(`Server running on port: ${PORT}`)))
    .catch((error)=> console.log(error.message));

方案2:将用户名密码作为参数传入(推荐)

不用把账号信息拼接在URI里,直接通过mongoose.connect的配置项传入,不需要做任何转义,避免写错:

const CONNECTION_URL = "mongodb+srv://cluster0.r92qc.mongodb.net/myFirstDatabase?retryWrites=true&w=majority";
const PORT = process.env.PORT || 5000;

mongoose.connect(CONNECTION_URL,{
  useNewUrlParser: true,
  useUnifiedTopology: true,
  user: "smith_bob",
  pass: "smith_bob@hotmail.com:T@llyHo!:" // 直接填原始密码,无需转义
})
.then(()=>app.listen(PORT,()=> console.log(`Server running on port: ${PORT}`)))
.catch((error)=> console.log(error.message));

内容的提问来源于stack exchange,提问作者Crowdpleasr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 16:57:00