先に結論
パスワード等に記号を使うときは、必要に応じてエンコードするのを忘れない。
簡単な経緯
Full Stack Vue.js, Express & MongoDB [1] - Express API
↑の動画を観ながら、node.js, express, mongoDB, vueを使ってアプリを作ろうとしていた。
動画ではmLab.comを使用していたが、2019年2月以降新規の会員登録を停止している旨が書いてあったので、今回はmongoDB Atlasを使うことにした。
エラー発生
mongoDBに接続しようとしたら以下のようなエラーがでた
UnhandledPromiseRejectionWarning: MongoParseError: URI does not have hostname, domain name and tld
原因
パスワードに記号を含めていたが、その文字をエンコードしていなかったため、エラーがでたようだ。
対策
記号をASCII Codes Tableをもとにエンコードしたら解決できた。
const uri = "mongodb+srv://<ID>:<password>@mongoDBのURI";
ここの<password>
欄に
p@ssw0rd'9'!
と入れたいなら、
p%40ssw0rd%279%27%21
とエンコードしてあげないといけない。
参考
Special characters in connection string password
雑感
たぶんID, PASSWORDを他の変数にいれて、エンコードしたうえでDBのURIを作成とかするほうがいいのかなと思った。