고양이와 코딩

미들웨어 및 라우트 실행 과정 본문

node.js

미들웨어 및 라우트 실행 과정

ovovvvvv 2024. 1. 28. 19:21
728x90

라우터 및 미들웨어 설정

// api/posts/index.js
import Router from 'koa-router';
import * as postsCtrl from './posts.ctrl.js';
import checkLoggedIn from '../../lib/checkLoggedIn.js';

const posts = new Router();

posts.get('/', postsCtrl.list);
posts.post('/', checkLoggedIn, postsCtrl.write);

const post = new Router(); // api/posts/:id
posts.get('/', postsCtrl.read);
posts.delete('/', checkLoggedIn, postsCtrl.remove);
posts.patch('/',checkLoggedIn, postsCtrl.update);

posts.use('/:id', postsCtrl.checkObjectId, post.routes());

export default posts;

 

checkLoggedIn.js 미들웨어 만들기

// checkLoggedIn.js
const checkLoggedIn = (ctx, next) => {
    if (!ctx.state.user) {
        ctx.status = 401;
        return;
    }
    return next();
};

export default checkLoggedIn;

checkLoggedIn 미들웨어는 사용자가 로그인 했는지 여부를 확인합니다.

 

이때 로그인이 확인 된 경우 next() 함수를 실행해 다음 미들웨어 또는 라우트 핸들러로 실행 흐름을 전달합니다!

 

 라우트 핸들링

export const write = async ctx  => {
    const schema = Joi.object().keys({
        // 객체가 다음 필드를 가지고 있음을 검증해줌
        title : Joi.string().required(), // required가 있으면 필수항목
        body: Joi.string().required(),
        tags: Joi.array()
            .items(Joi.string())
            .required(), // 문자열로 이루어진 배열
    });

    // 검증하고 나서 검증 실패인 경우 에러 처리
    const result = schema.validate(ctx.request.body);
    if(result.error) {
        ctx.status = 400;  // Bad request
        ctx.body = result.error;
        return;
    }
    const { title, body, tags } = ctx.request.body;
    const post = new Post({
        title, 
        body,
        tags,
        user: ctx.state.user,
    });

    try{
        await post.save();
        ctx.body = post;
    } catch (e) {
        ctx.throw(500, e);
    }
};

 

 

실행 흐름

  1. POST 요청이 / 경로로 들어오면 posts.post('/', checkLoggedIn, postsCtrl.write); 라우트 핸들러가 실행됩니다.
  2. 이때, 첫 번째 미들웨어로 checkLoggedIn이 적용되었기 때문에 checkLoggedIn 미들웨어가 실행됩니다.
  3. checkLoggedIn 미들웨어에서는 ctx.state.user를 확인하여 사용자가 로그인했는지 여부를 판단하고, 만약 로그인되어 있지 않다면 HTTP 상태 코드를 401로 설정하고 함수를 종료합니다.
  4. 만약 사용자가 로그인되어 있다면, next() 함수를 호출하여 다음 미들웨어 또는 라우트 핸들러로 실행 흐름을 전달합니다.
  5. 실행 흐름이 다음 미들웨어인 postsCtrl.write로 이동하게 됩니다.