[개발심화] Noed.js Express, Middleware - 6주차 (2)

Hong·2022년 10월 22일
0

🧐
코딩하며 하도 모니터를 봤더니 눈이 시리다
블루라이트 차단 안경 그런거를 사야하나
집에 있는 의자는 불편해서 한 시간만 앉아 있어도 허리가 부서질것 같음


의자는 조만간 갖다 버린다 두고보자




🖼

Express.js는 Node.js 환경에서 웹 서버, 또는 API서버를 제작하기 위해 사용되는 인기 있는 프레임워크다

화요일에는 월요일에 http모듈로 작성했던 서버를 Express프레임 워크를 사용해서 구현해봤다


Express프레임워크의 장점은

  1. 미들웨어 추가가 편리하다
  2. 자체 라우터를 제공한다

❓ 여기서 미들웨어는 무엇인가?

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



📝 메모장) 처음에 코드를 봤는데 이해가 안되서 간단히 메모를 적으며 이해해봤다

var express = require('express');
var app = express();
var router = express.Router();

//app.use, app.get 등 app뒤에 use(모든 method를 받을 때 미들웨어를 실행한다)과 get, post, put, delete각 method를 받을 때 미들웨어를 실행한다
/*
<express의 내장 미들웨어를 알아보자>
express.json()
express.raw()
express.Router()
express.static()
express.text()
express.urlencoded()
*/

//<express를 기본적으로 어떻게 적어주는지 알아보자>
app.use('/user/:id', function(req, res, next) { //미들웨어는 클라이언트가 /user/:id 경로에 관한 요청을 보내면 뒤의 함수로 실행된다
    console.log('Time', Date.now())
    next() //next인자는 다음 미들웨어를 실행할 수 있게한다
})


//<에러 핸들링에 대해 알아보자>
app.use(function(err, req, res, next) { //에러 핸들링은 항상 4개의 인자를 넣어줘야 한다 3개 넣으면 그냥 일반 미들웨어로 인식한다
    console.log(err.stack)
    res.status(500).send('Something broke!')
})

//<third party 미들웨어에 대해 알아보자(걍 누군가가 직접 만드는 미들웨어임)>
function thirdParty(req, res, next) {
    const youtuber = "woorimIt";
    console.log(`${youtube} 구독과 좋아요 눌러주세요.`);

    req.youtube = youtuber;
    next();
}

app.use("/", thirdParty); //"/"의 경로로 들어오면 thirdParty미들웨어가 작동한다
app.post("/login", (req, res) => {
    console.log(req.youtube);
})

express 프레임 워크를 어떻게 적는지 알고나니 월요일 http모듈로 직접 url분기를 처리해주고 request, respons를 처리해줄 때보다 훨씬 쉬운 방법이라는 것을 깨닫는다




🦞 과제를 살펴보자

이 과제는 크게 3가지 종류의 파일로 나뉜다

  1. app.js로써 express프레임워크가 적혀있으며 여기서 client로 들어온 request를 1차적으로 어떻게 처리할지 큰 틀을 잡아놓는다

  2. 두번째로는 각 url로 나눠진 router들이 있다 여기서는 client가 보낸 http method와 url에 따라 구체적으로 어떤 모듈을 써서 요청을 처리할지 정해놓는다

  3. controller로써 실제로 요청을 처리하는 함수들이 적혀있는 모듈이다


app.js

const express = require('express');
const cors = require('cors');
const app = express();

const port = 3001;

const flightRouter = require('./router/flightRouter');
const bookRouter = require('./router/bookRouter');
const airportRouter = require('./router/airportRouter');

app.use(cors()); //서버로 들어오는 모든 요청에 cors 응답을 부여합니다 
app.use(express.json()); //서버로 들어오는 모든 데이터에 json()을 적용해서 data를 출력했을 때 우리가 이해할 수 있는 객체로 표현시켜줍니다

//<아래와 같은 조건으로 요청이 들어오면 router로 처리한다>
app.use('/flight', flightRouter); //flight 분기로 들어오면 flightRouter를 실행합니다 (use를 섰으니까 모든 http mehod에 대해)
app.use('/book', bookRouter); //book 분기로 들어오면 bookRouter를 실행합니다 (use를 섰으니까 모든 http mehod에 대해)
app.use('/airport', airportRouter); //airport 분기로 들어오면 airportRouter를 실행합니다 (use를 섰으니까 모든 http mehod에 대해)

app.get('/', (req, res) => {
  res.status(200).send('Welcome, States Airline!');
});

app.use((req, res, next) => {
  res.status(404).send('Not Found!');
});

app.use((err, req, res, next) => { //이것은 error핸들러다 인자가 4개이기 때문임 (express에서 인자가 4개인 것은 에러 헨들러임)
  console.error(err.stack);
  res.status(500).send({
    message: 'Internal Server Error',
    stacktrace: err.toString()
  });
});

if (process.env.NODE_ENV !== "test") {
  app.listen(port, () => {
    console.log(`[RUN] StatesAirline Server... | http://localhost:${port}`);
  });
}



bookRouter

(flightRouter도 있는데 book만 들고옴)

const { findById, create, deleteById } = require('../controller/bookController');
const express = require('express');
const router = express.Router();

router.get('/', findById); //get method로 요청이 들어오면 findById를 실행한다

router.post('/', create); //post method로 요청이 들어오면 create를 실행한다

router.delete('/', deleteById); //delete method로 요청이 들어오면 deleteById를 실행한다

module.exports = router;



bookController.js

const flights = require('../repository/flightList');

// 여기에 항공편 예약 데이터를 저장합니다.
let booking = [];

module.exports = {
  // [GET] /book 요청을 수행합니다. (router에 적혀있음)
  // 전체 데이터 혹은 요청 된 flight_uuid, phone 값과 동일한 예약 데이터를 조회합니다. (요청으로 들어오는 flight_uuid, phone의 type이나 구체적인 값들은 서버를 만들 때 제공하는 API를 봐야 알 수 있음)
  findById: (req, res) => {
    let list = booking;

   if(req.query.flight_uuid) {
    list = list.filter((item)=> {
      item.flight_uuid === req.query.flight_uuid
    })
    return res.status(200).json(list);
   } 
   else if(req.query.phone) {
    list = list.filter((item)=> {
      return req.query.phone === item.phone;
    })
    return res.status(200).json(...list);
   }
    return res.status(200).json(booking);
  },

  // [POST] /book 요청을 수행합니다. (router에 적혀있음)
  // 요청 된 예약 데이터를 저장합니다.
  // 응답으로는 book_id를 리턴합니다.
  create: (req, res) => {
    if("flight_uuid" in req.body && "name" in req.body && "phone" in req.body) {
      booking.push(req.body);
    }
    else {
      return res.status(400).json({message : 'Error'})
    }
    return res.status(201).json({message: 'Create'});
  },

  // [DELETE] /book?phone={phone} 요청을 수행합니다. (router에 적혀있음)
  // 요청 된 phone 값과 동일한 예약 데이터를 삭제합니다.
  deleteById: (req, res) => {
    let deleteId;
    booking.forEach((el, id)=> {
      if(el.phone === req.query.phone) {
        deleteId = id;
      }
    })
    booking.splice(deleteId,1)
    return res.status(200).json(booking);
  }
};

보면 알겠지만 client가 본인의 id나 phone을 통해 예약을 확인할 수 있고 예약할 수 있으며 삭제도 할 수 있도록 만들어 놨다






화요일날 볼 땐 무슨 말인지 몰랐는데
또 보니 이해가 다르다

profile
Notorious

0개의 댓글