import mongoose from 'mongoose';
const {ObjectId} = mongoose.Types;
ObjectId.isValid(id);
// src/api/posts/posts.ctrl.js
...
import mongoose from 'mongoose';
const {ObjectId} = mongoose.Types;
export const checkObjectId = (ctx, next) => {
const {id} = ctx.params;
if(!ObjectId.isValid(id)) {
ctx.status = 400; // Bad Request
return;
}
return next();
}
...
posts.get('/', postsCtrl.list);
posts.post('/', postsCtrl.write);
posts.get('/:id', postsCtrl.checkObjectId, postsCtrl.read);
posts.delete('/:id', postsCtrl.checkObjectId, postsCtrl.remove);
posts.put('/:id', postsCtrl.checkObjectId, postsCtrl.replace);
...
posts.get('/', postsCtrl.list);
posts.post('/', postsCtrl.write);
const post = new Router(); // /api/posts/:id
post.get('/', postsCtrl.read);
post.delete('/', postsCtrl.remove);
post.patch('/', postsCtrl.update);
posts.use('/:id', postsCtrl.checkObjectId, post.routes())
터미널> yarn add joi
// src/api/posts/posts.ctrl.js
...
import Joi from 'joi';
...
export const write = async ctx => {
// Request Body 검증
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;
ctx.body = result.error;
return;
}
...
}
export const update = async ctx => {
const {id} = ctx.params;
// Request Body 검증 => write와 비슷한데 required()가 없음
const schema = Joi.object().keys({
// 객체가 다음 필드를 가지고 있음을 검증
title : Joi.string(),
body : Joi.string(),
tags : Joi.array().items(Joi.string()),
})
// 검증 후 실패인 경우 에러 처리
const result = schema.validate(ctx.request.body);
if(result.error) {
ctx.status = 400;
ctx.body = result.error;
return;
}
...
}
너무 좋은 글이네요. 공유해주셔서 감사합니다.