Node.js TIL 04

2021년 8월 5일에 작성된 문서 4번 입니다.
node.js의 배운 내용을 정리했습니다.


Node.js Express

미들웨어

미들웨어는 자동차 공장의 공정과 비슷합니다. 컨베이어 벨트 위에 올라가 있는 request에 필요한 기능을 더하거나, 문제가 발견된 불량품을 밖으로 걷어내는 역할을 합니다.

  • 미들웨어 함수:
    요청 오브젝트(req), 응답 오브젝트(res), 애플리케이션의 요청-응답 주기 중 그 다음의 미들웨어 함수 대한 액세스 권한을 갖는 함수.
    그 다음의 미들웨어 함수는 next라는 이름의 변수로 표시.

미들웨어를 사용하는 상황들

1. 모든 요청에 대해 url이나 메소드를 확인할 때

미들웨어는 말 그대로 프로세스 중간에 관여하여 특정 역할을 수행.

수많은 미들웨어가 있지만, 가장 단순한 미들웨어 로거(logger)를 예로 들겠습니다. 로거는 디버깅이나, 서버 관리에 도움이 되기 위해 console.log 로 적절한 데이터나 정보를 출력합니다. 데이터가 여러 미들웨어를 거치는 동안 응답할 결과를 만들어야 한다면, 미들웨어 사이사이에 로거를 삽입하여 현재 데이터를 확인하거나, 디버깅에 사용할 수 있습니다.

  • 미들웨어 구성
  • endpoint가 /이면서, 클라이언트로부터 GET 요청을 받았을 때 적용되는 미들웨어.
  • 파라미터의 순서
    req, res : 요청(request)/응답(response)
    next는 다음 미들웨어를 실행.
    * next 의 역할: next() 함수를 호출하여 다음 미들웨어로 데이터를 전달.

만약 특정 enpoint가 아니라 모든 요청에 동일한 미들웨어를 적용하려면 어떻게 해야 할까요?

  • 이때에는 메소드 app.use 를 사용.
//모든 요청에 대해 `LOGGED`가 출력
//app.use 메소드로 모든 요청에 대하여 미들웨어를 적용할 수 있다

const express = require('express');
const app = express();
const myLogger = function (req, res, next) {
console.log('LOGGED');
next();
};
app.use(myLogger);
app.get('/', function (req, res) {
res.send('Hello World!');
});
app.listen(3000);


 <br><br>    


#### 2.  POST 요청 등에 포함된 body(payload)를 구조화할 때(쉽게 얻어내고자 할 때)
```jsx
// 순수 node.js로 HTTP body(payload)를 받을 때에는 
// Buffer를 조합해서 복잡한 방식으로 body를 얻을 수 있다.

let body = [];
request.on('data', (chunk) => {
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString();
  // body 변수에는 문자열 형태로 payload가 담겨져 있습니다.
}); //네트워크상 chunk를 합치고, buffer를 body로 변환하는 작업이 필요


//body-parser 미들웨어를 사용하면 이 과정을 간단하게 처리할 수 있다.
//body-parser:
//Parse incoming request bodies in a middleware 
//미들웨어에서 요청이 들어오는 바디를 파싱함.
//before your handlers, available under the `req.body` property.
//내가 작성한 핸들러 전에, req.body 아래서 가능.
const bodyParser = require('body-parser')
const jsonParser = bodyParser.json()

// 생략
app.post('/api/users', jsonParser, function (req, res) {
  // req.body에는 JSON의 형태로 payload가 담겨져 있다.
})



3. 모든 요청/응답에 CORS 헤더를 붙여야 할 때

순수 node.js 코드에 CORS 헤더를 붙이려면, 응답 객체의 writeHead 메소드 등을 이용합니다. 이런 메소드를 이용하더라도 Access-Control-Allow-* 헤더를 매번 재정의해야 합니다. 그뿐만 아니라, OPTIONS 메소드에 대한 라우팅도 따로 구현해야 합니다.

//순수 node.js에 CORS를 적용
const defaultCorsHeader = {
  'Access-Control-Allow-Origin': '*',
  'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
  'Access-Control-Allow-Headers': 'Content-Type, Accept',
  'Access-Control-Max-Age': 10
};
// 생략
if (req.method === 'OPTIONS') {
  res.writeHead(201, defaultCorsHeader);
  res.end()
}


// 모든 요청에 대해 CORS 허용
const cors = require('cors')
// 생략
app.use(cors()) 
//cors 모듈을 이용해 CORS를 간단하게 처리할 수 있다.


// 특정 요청에 대해 CORS 허용
const cors = require('cors')
// 생략
app.get('/products/:id', cors(), function (req, res, next) {
  res.json({msg: 'This is CORS-enabled for a Single Route'})
})



4. 요청 헤더에 사용자 인증 정보가 담겨있는지 확인할 때

다음은 HTTP 요청에서 토큰이 있는지 여부를 판단하여, 이미 로그인한 사용자일 경우 성공, 아닐 경우 에러를 보내는 미들웨어 예제입니다.

  • 토큰(Token): 주로 사용자 인증에 사용.
//토큰을 통해 로그인 여부를 확인하는 미들웨어
app.use((req, res, next) => {
  // 토큰 있니? 없으면 받아줄 수 없어!
  if(req.headers.token){
    req.isLoggedIn = true;
    next()
  } else {
    res.status(400).send('invalid user')
  }
})

로그인 없이 웹사이트에 접근을 시도했을 때, 로그인 창 등으로 되돌려 보내는 경우를 경험해 본 적이 있을 겁니다. 서버에서는 요청에 포함된 데이터를 통해 미들웨어가 요구하는 조건에 맞지 않으면, 불량품으로 판단하고 돌려보내도록 구현할 수 있습니다.






Written with StackEdit.

좋은 웹페이지 즐겨찾기