MongoParseError: Password contains unescaped characters encodeURIComponent (feat : .env 설정)

bebrain·2023년 12월 5일
0

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의 도메인과 관련된 것들까지 모두 인코딩하도록 설계되었다.

참조 : https://velog.io/@dongkyun/encodeURIComponent%EC%99%80-encodeURI%EC%9D%98-%EC%B0%A8%EC%9D%B4
참조2 : https://www.freecodecamp.org/news/javascript-url-encode-example-how-to-use-encodeuricomponent-and-encodeuri/
참조3 : https://love2dev.com/blog/whats-the-difference-between-encodeuri-and-encodeuricomponent/

0개의 댓글