mongoDB에서 Database Access 설정시 패스워드에 특수문자를 넣었을 경우 볼 수 있는 에러이다.
URL에는 ASCII 코드로 정의된 128개의 문자들만이 사용 가능하다. 때문에 128개 이외의 문자들이 URL로 오기 위해서는 반드시 인코딩되어야 한다.
128개의 아스키 코드 중에서도 특별한 기능을 하는 &, space, !와 같은 문자들은 url로 입력되기 전에 escaped 되어야 한다. 그렇지 않으면 우리가 예측하지 못한 에러가 발생할 수 있다.
해결방법 1. 패스워드에서 특수문자를 뺀다
초간단 해결법 원인을 없애자
해결방법 2. encodeURIComponent()
encodeURIComponent() 함수는 URI의 특정한 문자를 UTF-8로 인코딩해 연속된 이스케이프 문자로 변경해 준다.
※ 이스케이프 : 문자열을 인코딩하는 것
// .env
ID = "mongodb아이디:"
PW = "mongodb패스워드"
npm install dotenv로 설치 후 .env파일에 환경변수를 설정한 다음,
// server.js
const { MongoClient } = require("mongodb");
require("dotenv").config(); // dotenv 라이브러리를 임포트한 뒤 config() 함수를 호출하면 환경변수에 접근가능하게 된다
// ES모듈인 경우 약간 다르니 CommonJS인지 ES인지 본인 프로젝트의 모듈 시스템을 확인 후 설정하자
let db;
const url =
"mongodb+srv://" +
process.env.ID +
encodeURIComponent(process.env.PW) +
"@cluster0.czwqqpl.mongodb.net/?retryWrites=true&w=majority";
new MongoClient(url)
.connect()
.then((client) => {
console.log("mongodb connecting success");
db = client.db("node-board");
app.listen(8080, function () {
console.log("Server Open : http://localhost:8080");
});
})
.catch((err) => {
console.log(err);
});
encodeURI()과 encodeURIComponent()
URL 전체를 인코딩할 때는 encodeURI(),
URL의 파라미터만 인코딩할 때는 encodeURIComponent()를 쓰면 된다.
encodeURI와 encodeURIComponent의 차이점은 encodeURIComponent가 전체 문자열을 인코딩한다는 점이다. encodeURI는 프로토콜 접두사('http://')와 도메인 이름을 무시하지만, encodeURIComponent는 encodeURI가 무시하는 URL의 도메인과 관련된 것들까지 모두 인코딩하도록 설계되었다.