바르고 뜨겁게

[NodeJS] express 프레임워크 본문

자바스크립트/Node Js

[NodeJS] express 프레임워크

RightHot 2018. 12. 31. 01:36

express - app.js


  • 요청(req) >> 미들웨어(app.use 형태) >> 응답(res)

  • next() 도 하지않고 res응답도 하지 않으면 클라이언트는 무한정으로 기다린다.

  • 라우터기능

    app.js는 쉽게말하면 중앙 통제를 하는 파일로, 라우터들을 연결한다.

    app.get('/users', (req,res)=>{
       res.send('유저 정보');
    });

    ...
  • 익스프레스 설정, 값 저장

    app.set

  • 미들웨어(middleware) 장착

    app.use : 모든경우 적용 / app.get app.post ... : 특수한 경우 적용

    • app.use안의 req, res로 요청과 응답을 조작할 수 있다. req, res는 모든 미들웨어를 차례대로 거쳐간다

    • 다음 미들웨어로 넘어가기 위해선 next() 를 호출하거나 res.send로 응답을 보내야한다.

      next가 없는데 넘어가는 경우? ... 선언된 함수내에 내장되어있다.

    • res.send == res.status(200).send() : status(200) 은 생략 가능하다

    • next()를 하면 다음 미들웨어로 넘어가지만, res.send로 응답을하면 다음미들웨어로 넘어가지 않고 리턴되고 끝이난다.

      app.use((res,req, next)=>{
       console.log('첫번째 미들웨어');
       next();
      });

      app.get('/',(req,res)=>{
       console.log('세번째 미들웨어');
       res.send('Hello middleware')
      });

      // 바로 위 미들웨어에서 next가 없으므로 호출되지 않음
      app.get('/users',(req,res)=>{
       console.log('네번째 미들웨어');
       res.send('Hello users');
      });
      첫번째 미들웨어
      두번째 미들웨어
      세번째 미들웨어

  • 라우팅 미들웨어 app.get app.post ...

    • http요청의 주소에 따라 일치되는 경우에만 동작되는 미들웨어

      '/users' 형태로 특수한 경우에만 동작 됨

      app.get('/users',(req,res)=>{
       console.log('네번째 미들웨어');
       res.send('Hello users');
      });

      ...
    • 라우터 분리 ( app.js가 복잡해지니까 routes 폴더에 라우터들을 따로 빼서 모듈화 한다.)

      app.js 의 경로와 routes/index.js 의 경로가 합쳐진다

      app.js

      const indexRouter = require('./routes/index');
      const usersRouter = require('./routes/users');

      app.use('/', indexRouter);
      app.use('/users', usersRouter);

      routes/index.js

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

      /* GET home page. */
      router.get('/', function(req, res, next) {
       res.render('index', { title: 'Express' });
      });

      module.exports = router;

      routes/users.js

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

      // app.js 경로랑 합쳐짐
      // GET /users/
      router.get('/',(req,res)=>{
       res.send('Hello users');
      });

      module.exports = router;

  • 유용한 미들웨어

    • const logger = require('morgan'); : 요청과 응답에 대한 로그 ( 응답후에 로그가 찍힘 )

      app.use(logger('dev'));
    • express 내장 미들웨어

      • req.on('data') , req.on('end') 를 해석하는 용도

        app.use(express.json());
        app.use(express.urlencoded({ extended: false }));
      • 정적 파일 라우터 ( public 폴더안에 있는 정적 파일을 가져옴 )

        파일이 없을때만 next 됨.

        app.use(express.static(path.join(__dirname, 'public')));
    • const cookieParser = require('cookie-parser'); :

      쿠키활성화 - 서버가 저장한 쿠키인지, 위조되 쿠키인지 판별

      app.use(cookieParser('secret code'));
    • const session = require('express-session'); : 메모리 세션 활성화

      • resave : 세션객체에 수정사항이 없어도 저장을 할지 여부

      • saveUninitialized : 처음에 빈 세션을 저장 할지 여부

      app.use(session({
       resave: false,
       saveUninitialized: false,
       secret: 'secret code',
       cookie:{
         httpOnly:true,
         secure: false
      }
      }));
    • const flash = require('connect-flash'); : 1회성 alert 메시지 표시

  • 404 처리 미들웨어와 에러 처리 미들웨어

    next 도 하지않고 res 응답도 하지 않으면 클라이언트는 계속 기다리게 됨

    • 404 NOT FOUND 처리 ( ex:요청에 대한 값이 라우터에 없는 상태) - 클라이언트 에러

      app.use((req, res, next)=>{
       res.status(404).send('NOT FOUND');
      });
    • 500 에러 처리 - 서버 에러

      routes/index.js

      router.get('/',(req,res,next)=>{
       console.log('세번째 미들웨어');
       //res.send('Hello middleware')
       try{
         throw new Error('임의 서버 에러')
      }catch( error ){
         next(error);
      }
      });

      app.js

      app.use(function(err, req, res, next){
       console.log(err);
       res.stauts(500).send('SERVER ERROR');
      });

  • 파일 불러오기

    • HTML

      router.get('/',(req,res,next)=>{
       console.log('세번째 미들웨어');
       res.sendFile('html 파일경로');
      });
    • 템플릿 뷰 엔진

      router.get('/',(req,res,next)=>{
       console.log('세번째 미들웨어');
       res.render('파일 경로'); //views 까진 자동으로 들어감
      });

  • 미들웨어->템플릿엔진 변수 선언

    • 템플릿 엔진에 렌더링 되는 변수를 app.js 에서 선언가능

      아래 처럼 하면 다른 미들웨어에서 선언이 불가능

      res.render('error',{ message: '메시지변수', error: '에러변수'});

      아래 처럼 하면 다른 미들웨어에서 선언 하더라도 템플릿 뷰 엔진에서 사용가능하다.

      res.locals.message = err.message;
      res.locals.error = req.app.get('env') === 'development' ? err : {};
    • express 에서 변수 공유 , 미들웨어간 변수 공유

      app.set('키값','값');
      app.get('키값'); // 값 반환

      라우터에선 app 이라는 변수가 없기때문에 아래 처럼 사용

      req.app.get('키값');
    • app. 은 모든 요청에서 공유되기 때문에 특정 요청 에서만 값을 저장하고 싶다면 아래 처럼 사용

      req,'키값' = '값';
      req.'키값' // 값 반환

  • 기타

    app.use(express.json());

    아래 처럼 쓸 수 있다.

    app.use((req, res, ext)=>{
       express.json()(req, res, next);
    });


Comments