고양이와 코딩
미들웨어 및 라우트 실행 과정 본문
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);
}
};
실행 흐름
- POST 요청이 / 경로로 들어오면 posts.post('/', checkLoggedIn, postsCtrl.write); 라우트 핸들러가 실행됩니다.
- 이때, 첫 번째 미들웨어로 checkLoggedIn이 적용되었기 때문에 checkLoggedIn 미들웨어가 실행됩니다.
- checkLoggedIn 미들웨어에서는 ctx.state.user를 확인하여 사용자가 로그인했는지 여부를 판단하고, 만약 로그인되어 있지 않다면 HTTP 상태 코드를 401로 설정하고 함수를 종료합니다.
- 만약 사용자가 로그인되어 있다면, next() 함수를 호출하여 다음 미들웨어 또는 라우트 핸들러로 실행 흐름을 전달합니다.
- 실행 흐름이 다음 미들웨어인 postsCtrl.write로 이동하게 됩니다.
'node.js' 카테고리의 다른 글
You have tried to call .then(), .catch(), or invoked await on the result .. 어쩌구 mysql2 에러 해결하기 (1) | 2024.04.06 |
---|---|
[node] 비밀번호 암호화 - 회원가입, 로그인 구현하기 (0) | 2024.02.24 |
리액트를 다루는 기술 node.js esm 에러 해결 (2) | 2024.01.14 |
Koa 프레임워크에서 koa-router 사용해보기 (0) | 2024.01.08 |