Skip to content

express-validatorย #13

@Ji-eun1

Description

@Ji-eun1

๐Ÿ˜Ž ย  ๊ฒฐ๊ณผ


ํšŒ์›๊ฐ€์ž…

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)
    })
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions