Node.js MiddleWares #2

app.get()말고 다른 것을 알아보자.

app.use()는 global middleware를 만들수 있게 해준다.

어느 url에도 작동하는 middleware 이다.

gossipMiddleware를 app.use로 옮긴다.

app.use(gossipMiddleware);

app.get("/", handleHome);

조심해야 할 것은 순서다.

middleware를 use하는게 먼저 오고 그 다음에 url의 get이 와야한다.

이렇게 하고 나면 새로운 페이지로 넘어가려 할때

ex:)

localhost:4000/lolololo 이런식이라면

console에서 유저가 저 url로 갈려고 한다 라고 나온다.

모든 route에서 이 함수를 사용하는거다.

만약에 순서가 바뀐다면 ?

app.get("/", handleHome);

app.use(gossipMiddleware);

console에 나오던 someone is going to:/문구가 안나온다.

왜냐하면 application이 있고 request가 오면

express는 모든 걸 위에서 아래 순으로 실행 시킨다.

JavaScript처럼 말이다.

express는 우선 request를 받으면 handleHome을 실행시킨다.

그리고 나중에 gossipMiddleware를 사용하도록 설정한다.

그래서 console에 아무런 문구가 나오지 않게 되는 거다.

middleware를 위에다 두면 모든 route에 적용되는 거다.

이 번에는 protectionMiddleware라는 middleware를 써보겠다.

const app = express();

const logger = (req, res, next) => {

console.log(`${req.method} ${req.url}`);

next(); 

 };

const privateMiddleware = (req, res, next) => {

const url = req.url;

if (url === "/protected") {

return res.send("<h1>Not Allowed </h1>");

}

next();

 console.log("Allowed, you may continue.");

};

const handleHome = (req, res) => {

return res.send("<h1>I love middlewares.😍</h1>");

};

const handleLogin = (req, res) => {

return res.send({ message: "Login here." });

};

 const handleProtected = (req, res) => {

return res.send("Welcome to the private lounge.");

};

app.use(logger);

app.use(privateMiddleware);

app.get("/", handleHome);

이런식으로 바꿔 보자.

url 가져 오고 만약 이 url이 protected와 같다면 res.send()를 써서 html을 리턴한다.
("진입을 허용하지 않는다.")

아니면 next()를 호출한다.

두개의 middleware가 생겼다.

logger middleware는 application 전체에서 사용되고 있다.

method와 url을 console.log해주는 역할을 해준다.

request에 관한 모든 정보를 가지고 있는 request object를 이용한다.

privateMiddleware는 url 정보를 받아서 /protected와 같은걸 확인하면

중간에 개입해서 다음 함수를 호출하는걸 막고

url이 /protected가 아니라면 다음 함수를 호출하는거다.

/protected 페이지로 이동하면 middleware가 controller가 되었다.

middleware가 프로세스를 중단 시키고 Not Allowed라고 문구를 보냈다.

/protected페이지로 가면 logger을 거치고 privateMiddleware를 거치면서 멈춘거다.

handleHome이나 handleProtected로 지속되지 않는거다.

middleware는 일반적인 controller랑 같은 거다.

next 함수 argument 하나가 추가 된다는 점만 빼고 middleware를 app 전체에 어떤 url에서도 사용 할 수 있도록 할수도 있고 middleware 하나의 url에만 사용되게 할수도 있다.

 app.use(logger);

app.get("/", logger, handleHome);

app.get("/protected", logger, handleProtected);

이런 식으로

기억해야 될건 middleware가 next()호출하지 않으면

handleProtectedhandleHome 같은 다음 함수들은 절대 실행 되지 않는다.

app.get("/protected", logger, handleProtected);

여기 있는 함수는 middleware나 controller가 될수 있다.

이 경우는 logger는 middlewar가 된거다.

함수가 next()를 호출하면 그건 middleware이다.

어떤 함수는 send를 사용하는데 그러면 그건 middleware가 아니다.

연결이 중단되기 때문이다.

그리고 middleware는 왼쪽에서 오른쪽 순서로 작동한다.

먼저 route가 있고 첫번째 함수가 실행되고 만약 logger가 next()를 호출하면

다음은 handleHome이 실행되는거다.

handleHome이 next()를 호출하면 다음 거를 실행 하는 거다.

그런데 handleHome이 마지막이다.

그래서 handleHome에서 res.send를 사용하는 거다.

handleHome 또한 middleware이다.

모두 req,res,next를 포함하고 있다.

사용하는 것도 있고 안하는것 도 있지만 모두 포함 하고 있는거다.

좋은 웹페이지 즐겨찾기