ObjectId 검증
- read, remove, update의 경우
ObjectId
검증이 필요
- 각각의 함수에 검증 중복 코드 보다는 라우트에 쉽게 적용
controller에 아래와 같이 작성
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();
};
sr/api/posts/index.js
posts.get('/:id', postsCtrl.checkObjectId, postsCtrl.read);
posts.delete('/:id', postsCtrl.checkObjectId, postsCtrl.remove);
posts.patch('/:id', postsCtrl.checkObjectId, postsCtrl.update);
// 위 코드에서 공통적인 router를 아래와 같이 작성 가능
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());
Request Body 거증
write
, update
의 요청 내용을 검증
- title, body, tags 값을 모두 전달 받았는지
- 라이브러리 Joi
$ yarn add joi
import Joi from 'joi';
(...)
export const write = async ctx => {
const schema = Joi.object().keys({
title: Joi.string().required(),
body: Joi.string().required(),
tags: Joi.array()
.items(Joi.string())
.required(),
});
const result = Joi.validate(ctx.request.body, schema);
if (result.error) {
ctx.status = 400;
ctx.body = result.error;
return;
}
- 특정 필드가 반드시 존재하지 않을때는 아래와 같이
required()
를 제거하고
export const update = async ctx => {
const { id } = ctx.params;
const schema = Joi.object().keys({
title: Joi.string(),
body: Joi.string(),
tags: Joi.array().items(Joi.string()),
});
const result = Joi.validate(ctx.request.body, schema);
if (result.error) {
ctx.status = 400; // bad request
ctx.body = result.error;
return;
}