๐ ย ๊ฒฐ๊ณผ
ํ์๊ฐ์
2022-09-14.5.41.51.mov
๋ก๊ทธ์ธ
2022-09-14.5.33.06.mov
๐ ์ฐธ๊ณ ๋งํฌ
express-validator ๊ณต์๋ฌธ์
express-validator ( middleware )
checkSchema / validate ๋ถ๋ฆฌ
โ๏ธ ย express-validator ์ฌ์ฉ ์ด์
์ฒ์์๋ client-side ์ validation ์ ๋ง๋ค์๋๋ฐ, server-side ์ ๋นํด ๋ถ์์ ํ๋ค๋ ์ง์ ์ ๋ฐ์ ๋ฐ๊พธ๊ฒ ๋์๋ค.
client-side validation ์ ์ ์ ๊ฐ ์์๋ก ์กฐ์ํ ์ ์์ด ์ํํ๋ค.
server-side validation ์ผ๋ก schema validator ๋ฅผ ์ฌ์ฉํ๋ ค ํ์ผ๋ update, remove ์ validation ๋๋ฝ๋๋ ๋ฌธ์ ๋ก express-validator ๋ฅผ ์ ํํ๊ฒ ๋์๋ค.
๐ ย ์์
๊ณผ์
๋ฐฑ์๋
1. validation > checkSchema.js, validation.js ์์ฑ
์คํค๋ง์ validation ์ ์ฒดํฌํ ๋ฏธ๋ค์จ์ด๋ฅผ ๋ง๋ ๋ค.
validation ์ธ์ฆ (O) => ํต๊ณผ
validation ์ธ์ฆ (X) => ๋ถํต, ์๋ฌ ๋ฉ์์ง ์ ์ก
checkSchema.js
case - forum, comment, signup, profile, signin, withdrawal
์์๋ก signin case ๋ง ๋ณต๋ถํจ
module . exports = ( method ) => {
switch ( method ) {
case 'signin' : {
return [
check ( 'email' )
. notEmpty ( )
. withMessage ( '์์ด๋๋ฅผ ์
๋ ฅํ์ธ์.' )
. custom ( async email => {
const user = await User . findOne ( { $and : [ { "email" : email } , { "active" : "true" } ] } ) ;
if ( ! user ) return Promise . reject ( '์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ค์ ํ์ธํด์ฃผ์ธ์.' )
}
) ,
check ( 'password' )
. notEmpty ( )
. withMessage ( '๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํ์ธ์.' )
. custom ( async ( password , { req} ) => {
const user = await User . findOne ( { $and : [ { "email" : req . body . email } , { "active" : "true" } ] } ) ;
const isMatch = await bcrypt . compare ( password , user . password ) ;
if ( ! isMatch ) return Promise . reject ( '์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ค์ ํ์ธํด์ฃผ์ธ์.' )
}
) ,
]
}
}
}
validation.js
module . exports = validations => {
return async ( req , res , next ) => {
await Promise . all ( validations . map ( validation =>
validation . run ( req )
)
) ;
const errors = validationResult ( req ) ;
if ( errors . isEmpty ( ) ) { // validation ํต๊ณผ
return next ( ) ;
} else { // validation ๋ถํต'
res . status ( 400 ) . json (
errors . array ( ) [ 0 ] . msg
) ;
}
} ;
} ;
2. routes
validation ๋ฏธ๋ค์จ์ด๋ฅผ ํต๊ณผํด์ผ๋ง controller ๊ฐ ์๋ํ๋๋ก, ๋ฏธ๋ค์จ์ด๋ฅผ controller ์์ ๋๋ค.
( routes > forums.js ์์ )
router . post ( '/post' , auth , validate ( checkSchema ( 'forum' ) ) , postForum ) ;
router . put ( '/update/:id' , validate ( checkSchema ( 'forum' ) ) , updateForum ) ;
ํ๋ก ํธ
1. ๊ฒฝ๊ณ ์ฐฝ ๋ฉ์์ง ๋ฃ๊ธฐ
validation ์ด ๋ถํต์ผ ๊ฒฝ์ฐ, api ํธ์ถ์ ์คํจํ๋ค.
๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ ์์ผ๋ก catch ๋ฌธ์์ ์๋ฌ ๋ฉ์์ง๋ฅผ ๋ฐ์ ๊ฒฝ๊ณ ์ฐฝ์ ๋์ด๋ค.
const createForum = async ( e : FormEventType ) => {
e . preventDefault ( ) ;
const body = {
titleText : titleText ,
mainText : mainText ,
attachImageNames : attachImageNames
}
Forums . postForum ( body )
. then ( ( ) => {
setIsSubmit ( isSubmit => ! isSubmit ) ;
formReset ( ) ;
} )
. catch ( ( err : any ) => { // validation ๋ถํต => ๊ฒฝ๊ณ ์ฐฝ ๋์ฐ๊ธฐ
setAlertShowMessage ( err . response . data )
setAlertShow ( true )
} )
}
๐ ย ๊ฒฐ๊ณผ
ํ์๊ฐ์
2022-09-14.5.41.51.mov
๋ก๊ทธ์ธ
2022-09-14.5.33.06.mov
๐ ์ฐธ๊ณ ๋งํฌ
express-validator ๊ณต์๋ฌธ์
express-validator ( middleware )
checkSchema / validate ๋ถ๋ฆฌ
โ๏ธ ย express-validator ์ฌ์ฉ ์ด์
๐ ย ์์ ๊ณผ์
๋ฐฑ์๋
1. validation > checkSchema.js, validation.js ์์ฑ
์คํค๋ง์ validation ์ ์ฒดํฌํ ๋ฏธ๋ค์จ์ด๋ฅผ ๋ง๋ ๋ค.
checkSchema.js
validation.js
2. routes
validation ๋ฏธ๋ค์จ์ด๋ฅผ ํต๊ณผํด์ผ๋ง controller ๊ฐ ์๋ํ๋๋ก, ๋ฏธ๋ค์จ์ด๋ฅผ controller ์์ ๋๋ค.
( routes > forums.js ์์ )
ํ๋ก ํธ
1. ๊ฒฝ๊ณ ์ฐฝ ๋ฉ์์ง ๋ฃ๊ธฐ
validation ์ด ๋ถํต์ผ ๊ฒฝ์ฐ, api ํธ์ถ์ ์คํจํ๋ค.
๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ ์์ผ๋ก catch ๋ฌธ์์ ์๋ฌ ๋ฉ์์ง๋ฅผ ๋ฐ์ ๊ฒฝ๊ณ ์ฐฝ์ ๋์ด๋ค.