node.js에서 전역변수 갖는 법

i do as i say·2020년 3월 19일
1
post-thumbnail

js파일에 있는 변수를 pug나 html에서 사용하고 싶을 땐 어떻게 해야 될까?
예를 들어, a 태그의 href를 "/user/edit" 이렇게 하나씩 지정하게 되면, URL 수정이 있을 때 href에 하나씩 방문하여 수정해야 되는 번거로움이 있을 것이다.

이러한 중노동(??)을 해결해 줄 수 있는 방법은 많고 많겠지만, 라우터 등 내용물이 수정될 수 있는 것들을 전역 변수로 주고, 그 변수만 href에 넣어서, 만약 수정이 된다고 해도 herf에 있는 URL을 수정하는 대신 변수 안에 있는 내용물을 수정하는 방법을 보여 주려고 한다.

전역 변수는 우리가 만든 전역 미들웨어 안에 넣어서 사용할 수가 있다.

app.use(middleWares); //얘가 바로 전역 변수를 담는 전역 미들웨어이다.
app.use(routes.home, globalRouter);
app.use(routes.user, userRouter);
app.listen(4000);

전역 미들웨어는 라우트에 닿기 바로 직전에 넣어 주는 것을 선호하는 편이다. 모든 미들웨어가 다 끝나고, 전역 미들웨어로 깔끔하게 정리해 주는 느낌이라고 해야 되나.

전역 미들웨어는 js 파일로 설정해 준다. (정리를 위해)

middleWares.js

//미들웨어에 라우트를 import 시켜 준다. (그래야 사용 가능)
import routes from "./routes";

//export를 시켜 줘야 된다. 꼭. 그리고 app.js에 이것을 import시켜야 된다는 것을 명심하자.
export const localMiddleWare = (req, res, next) => {
  res.locals.siteName = "node study";
  res.locals.routes = routes;
  next();
  //미들웨어니까 꼭 next를 사용하자.
};

express에서 로컬 변수를 전역 변수로 바꾸는 방법은 res.locals.변수이름 = 값으로 간단하게 나타낼 수 있다.

<a href=routes.home></a>
<!--html-->
div 여기가 어디냐면, ${siteName}
<!--pug-->

이렇게 적용시킬 수 있다.

만약, 하나의 페이지(라우트)에만 변수를 설정하고 싶다면 어떻게 해야 될까? 페이지 이름이 전부 "node study"가 아닐 것이고, 유저 정보라든지 프로필 수정이라든지 하는 각각의 특색엔?

export const join = (req, res) => {
  res.render("join", { pageTitle: "회원가입 | " });
};

컨트롤러에 직접 변수를 줄 수가 있다. render 함수의 첫 번째 인자는 view page를 연결해 주는 것이고, 두 번째 인자는 템플릿에 추가할 정보가 담긴 객체이다. (꼭 객체로 해 줘야 된다. 약속이다.) pageTitle이란 key(변수)를 사용하면 "회원가입 |"이라는 값을 쓸 수 있다. join이라는 페이지 안에서만 사용할 수 있다.

틀린 게 있으면 지적해 주세요~

profile
커신이 고칼로리

1개의 댓글

comment-user-thumbnail
2020년 6월 6일

"낮말은 새가 듣고 밥 말은 라면 먹고 싶다" ㅋㅋㅋㅋ

답글 달기