mongodb+srv URI 不能有端口号

我有(注意:用户名和密码是组成的):

const CONNECTION_URL = "mongodb+srv://smith_bob:smith_bob@hotmail.com:T@llyHo!:@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));

但是当我运行 nodemon index.js 时得到以下信息:

mondodb+srv URI 不能有端口号
[nodemon] clean exit - 重启前等待更改

有什么想法吗?

我尝试使用百分比编码字符,但出现如下错误:

. . . smith_bob:smith_bob@hotmail.com:%40@llyHo!: . . .

mongodb+srv URI 不能有端口号

. . . smith_bob%3Asmith_bob%40hotmail.com%3AT%40llyHo!%3A . . .

身份验证错误:身份验证失败

. . . smith_bob:smith_bob%40hotmail.com%3AT%40llyHo!: . . .

密码包含非转义字符

. . . smith_bob:smith_bob@hotmail.com%3AT%40llyHo!: . . .

mongodb+srv URI 不能有端口号

stack overflow mongodb+srv URI cannot have port number
原文答案

答案:

作者头像

似乎是因为在主机 @ 之前存在多个 :cluster0.r92qc.mongodb.net 而没有百分比编码。尝试以以下格式提供它:

mongodb+srv://username:password@host

如果用户名或密码包含任何一个 : / ? # [ ] @ 字符,则必须使用 percent encoding 进行转换。以你的连接字符串为例,如果用户名是 smith_bob:smith_bob@hotmail.com ,密码是 T@llyHo!: ,它应该分别转换为 smith_bob%3Asmith_bob%40hotmail.comT%40llyHo!%3A ,连接字符串会变成:

"mongodb+srv://smith_bob%3Asmith_bob%40hotmail.com:T%40llyHo!%3A@cluster0.r92qc.mongodb.net/myFirstDatabase?retryWrites=true&w=majority"

要了解有关连接字符串格式的更多信息,请参阅 here

作者头像

尝试上一篇文章中提到的百分比解码。对我来说,它奏效了。如果用户名是 user 并且密码是 user@ 那么 mongodb+srv://user:user%40@cluster0.r92qc.mongodb.net/myFirstDatabase?retryWrites=true&w=majority

其中 %40 是密码中 @ 的百分比编码。