본문 바로가기

Node.js

[Node.js 11강] 모든(또는 특정)요청에 대한 공통로직을 처리하기 위해express next() 사용하기

이번엔 express의 next()함수를 이용해서 모든 요청 또는 특정URL 요청에 대한 공통로직으 처리하는 방법을 알아보겠습니다. 특히, 최종 호출되는 ejs에서 사용할 수 있도록 값을 세팅해서 다음 미들웨어 함수로 전달하는 방법도 알아보겠습니다. 

 

 

Express 애플리케이션 레벨 미들웨어에서 공통로직 추가

web.js(app.js)에 아래와 같이 추가하면 모든 요청에 대해 공통로직을 추가할 수 있습니다. 

next()를 호출하면 다음 라우터 레벨 미들웨어 함수를 호출합니다. (요청 URL에 맞는 라우팅을 찾아서 실행)

var express = require('express');
var app = express();

app.use(function(req, res, next){
	..공통로직 처리..
    next();
});

 

모든 URL이 아닌 특정 URL 경로에 맞는 경우만 실행하려면 첫번째 인자에 URL 경로를 추가해줍니다. 

app.use('/admin/:id', function (req, res, next) {
  
  ..관리자 권한 체크...
  next();
  
});

 

 

공통 EJS 파일(header나 footer)에서 사용할 데이터를 세팅하는 방법

클라이언트에서 넘어온 파라미터가 아니라 애플리케이션 레벨 미들웨어에서 설정한 값을 ejs 파일에서 사용하려면 'res.locals.변수명 = 값' 을 이용하면 됩니다. 

app.use(function(req, res, next){
	res.locals.isLogin = true;
});

 

어떤 경우에 사용할까?

모든 파일에 공통적으로 include 되는 header.ejs에 로그인한 정보를 표시하는 로직이 있었습니다. 

<div id="naverLogout" class="header-profile">
<% if(isLogin){ %>
  <div>
    <img src="<%=loginObj.profileImage%>" alt="회원 이미지"/>
    <div style="font-size:10pt;">
      <span><%=loginObj.mberNm%>님</span>    
    </div>
  </div>
<% }else{ %>
  <div>
    <img src="/css/images/myInfo.gif" alt="회원 이미지"/>
    <div  style="font-size:10pt;">
      <span>Guest모드</span><br/>
    </div>
  </div>
<% } %>
</div>

header.ejs는 모든 ejs 파일에 include 되어 있습니다.

<% include ../layout/header %>

 

모든 요청에 대해 ejs 파일로 res.render를 하기 전에 isLogin 이라는 변수를 세팅해줘야 했습니다.(isLogin이 없으면 에러가 발생함)

//일반적으로 뷰에 렌더링할 때 데이터를 념겨주는 방법
router.get('/club/list', function (req, res) {
	res.render("club/list", {isLogin : true});
});

 

모든 라우팅 처리 로직에 isLogin 값을 세팅하는 로직을 추가하기는 어려우니, 위에서 알아본 express next 함수를 이용해서 아래와 같이 처리했습니다. 'res.locals.isLogin = true' 을 하면 마지막에 뷰 렌더링한 EJS 파일에서 isLogin을 사용할 수 있게 됩니다. 

app.use(function(req, res, next){
	
	var cookieLoginObj = req.signedCookies.loginObj;
	
	if(cookieLoginObj && cookieLoginObj.mberSn !== ''){
		res.locals.loginObj = cookieLoginObj;
		res.locals.isLogin = true;
	}else{
		var loginObj = {
			mberNm : "",
			mberSn : "",
			profileImage : "",
			isTest : ""
		};
		res.locals.loginObj = loginObj;
		res.locals.isLogin = false;
	}
	
	res.locals.clubSn = '';
	
	next();
});

 

 

 

참고 : 

https://expressjs.com/ko/guide/using-middleware.html

 

Express 미들웨어 사용

미들웨어 사용 Express는 자체적인 최소한의 기능을 갖춘 라우팅 및 미들웨어 웹 프레임워크이며, Express 애플리케이션은 기본적으로 일련의 미들웨어 함수 호출입니다. 미들웨어 함수는 요청 오브젝트(req), 응답 오브젝트 (res), 그리고 애플리케이션의 요청-응답 주기 중 그 다음의 미들웨어 함수 대한 액세스 권한을 갖는 함수입니다. 그 다음의 미들웨어 함수는 일반적으로 next라는 이름의 변수로 표시됩니다. 미들웨어 함수는 다음과 같은 태스크를

expressjs.com