기술공부/언어

[Node.js] Express app에서 정적 라우트 경로값을 동적으로 변경하기

봉두두 2023. 6. 16. 14:47
728x90

Chat GPT는 어떻게 활용하느냐에 따라 옳은 정보를 주기도 하고, 되려 더 돌아가는 정보를 주기도 하는 듯 하다.

오늘 chat GPT의 덕을 톡톡히 봤는데,

그 중에 하나가 바로 express.static()를 동적으로 활용하는 방법이다.

 

처음 가이드 해 준 방법

Q. nodejs 에서 이벤트가 발생했을 때 express static path를 바꾸고싶은데 방법이 있을까?

// 기본 정적 경로 설정
app.use(express.static(path.join(__dirname, 'public')));

// 이벤트 발생 시 정적 경로 변경
function changeStaticPath(newPath: string) {
  app._router.stack.forEach((middleware) => {
    if (middleware.name === 'serveStatic') {
      middleware.handle = express.static(newPath);
    }
  });
}

app._router.stack에 여러 Router 레이어가 있다는 걸 이 때 알았다.

원하는 라우터를 골라서 수정 가능하다는 것을 알게됨.

과연 이게 안정적인 방법일 수 있는지는 아직 모르겠다.

 

그런데, 경로 변경은 적용이 안 됨.

 

그래서 다시 물어봤다.

 

두 번째 가이드 해 준 방법

Q. 경로가 안 바뀌는데ㅜ

// 기본 정적 경로 설정
app.use(express.static(path.join(__dirname, 'public')));

// 이벤트 발생 시 경로 변경
function changeStaticPath(newPath: string) {
  // 새로운 Express 애플리케이션 생성
  const newApp = express();
  newApp.use(express.static(newPath));

  // 기존 애플리케이션 미들웨어를 새로운 애플리케이션으로 복사
  app._router.stack.forEach((middleware) => {
    newApp.use(middleware);
  });

  // 기존 애플리케이션을 새로운 애플리케이션으로 교체
  app = newApp;
}

app을 초기화해서 다시 설정한다고..?

뭔가 너무 거창한 과정이 더해진 것 같다.

더 심플한 방법이 없는지 다시물어본다.

 

세 번째 가이드 해 준 방법(It works!)

Q. 다른 설정값은 다 유지하고 정적경로만 변경하고싶어.

// 기본 정적 경로 설정
app.use(express.static(path.join(__dirname, 'public')));

// 이벤트 발생 시 경로 변경
function changeStaticPath(newPath) {
  app._router.stack.forEach((middleware) => {
    if (middleware.name === 'serveStatic') {
      middleware.handle = express.static(newPath);
      middleware.handle.root = newPath; // <=== 여기가 핵심이었다.
    }
  });
}

결국 핵심은 middleware.handle.root 값에 새로운 경로를 할당해주는 것이었다.

구글링보다 백만배는 더 나은 chat GPT,,,

내 시간 세이브 해주어서 땡큐!

728x90
728x90