mongodb+srv URI提示不能包含端口号及密码转义相关问题求助
问题根因
你遇到的所有报错本质都是MongoDB连接URI的身份段解析错误导致的:
- MongoDB SRV连接URI的标准结构为
mongodb+srv://<用户名>:<密码>@<集群地址>/<数据库名>?<可选参数>,其中:是用户名和密码的分隔符,@是身份段和集群地址段的分隔符,二者都属于URI保留字符。 - 你的密码中包含
@、:这类保留字符,未转义时会被解析器误判为分隔符:解析器会把密码中第一个@后面的内容识别为集群地址,里面的冒号会被当成端口号分隔符,因此抛出「mongodb+srv URI cannot have port number」错误。 - 你之前的转义操作存在两类错误:
- 错误转义了用户名和密码之间的分隔冒号,导致解析器无法正确拆分用户名和密码,抛出认证失败错误
- 没有完整转义密码中的所有保留字符,导致残留的特殊字符被误解析
正确处理方案
有两种可选方案,推荐优先用第二种,完全避开转义问题:
方案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
相关产品推荐
相关产品推荐

