From 3584345bfadb994c797f1a0d99d69b8c23ff9c72 Mon Sep 17 00:00:00 2001 From: Jun4928 Date: Wed, 6 Jan 2021 19:05:41 +0900 Subject: [PATCH] Add: express-validator --- app.js | 4 ++-- controllers/UserController.js | 5 ----- errors/errorGenerator.js | 15 ++++++++++++--- errors/errorWrapper.js | 7 +++++++ middlewares/validateToken.js | 1 - package-lock.json | 19 +++++++++++++++++++ package.json | 1 + routes/UserRouter.js | 15 +++++++++++++-- 8 files changed, 54 insertions(+), 13 deletions(-) diff --git a/app.js b/app.js index 4b9a5cd..72f82e4 100644 --- a/app.js +++ b/app.js @@ -10,9 +10,9 @@ app.use(routes) // general error handler app.use((err, req, res, next) => { - const { status, message } = err + const { statusCode, message } = err console.error(err) - res.status(status || 500).json({ message }) + res.status(statusCode).json({ message }) }) module.exports = app diff --git a/controllers/UserController.js b/controllers/UserController.js index 0644fbe..67ed890 100644 --- a/controllers/UserController.js +++ b/controllers/UserController.js @@ -6,12 +6,9 @@ const { errorWrapper, errorGenerator } = require('../errors') const signUp = errorWrapper(async (req, res) => { const { email, password } = req.body - if (!email || !password) errorGenerator({ statusCode: 400, message: 'invalid input' }) - const hashedPassword = await bcrypt.hash(password, 10) const foundUser = await UserService.findUser({ email }) - if (foundUser) errorGenerator({ statusCode: 409, message: 'duplicated' }) const createdUser = await UserService.createUser({ @@ -29,12 +26,10 @@ const logIn = errorWrapper(async (req, res) => { const { email, password: inputPassword } = req.body const foundUser = await UserService.findUser({ email }) - if (!foundUser) errorGenerator({ statusCode: 400, message: 'client input invalid' }) const { id, password: hashedPassword } = foundUser const isValidPassword = await bcrypt.compare(inputPassword, hashedPassword) - if (!isValidPassword) errorGenerator({ statusCode: 400, message: 'client input invalid' }) const token = jwt.sign({ id }, AUTH_TOKEN_SALT) diff --git a/errors/errorGenerator.js b/errors/errorGenerator.js index dd7b81a..70aa6d9 100644 --- a/errors/errorGenerator.js +++ b/errors/errorGenerator.js @@ -1,6 +1,15 @@ -const errorGenerator = ({ message, statusCode = 500 }) => { - const err = new Error(message) - err.status = statusCode +const DEFAULT_HTTP_STATUS_MESSAGES = { + 400: 'Bad Requests', + 401: 'Unauthorized', + 403: 'Foribdden', + 404: 'Not Found', + 500: 'Internal Server Error', + 503: 'Temporary Unavailable', +} + +const errorGenerator = ({ message = '', statusCode = 500 }) => { + const err = new Error(message || DEFAULT_HTTP_STATUS_MESSAGES[statusCode]) + err.statusCode = statusCode throw err } diff --git a/errors/errorWrapper.js b/errors/errorWrapper.js index 4a5d365..b735419 100644 --- a/errors/errorWrapper.js +++ b/errors/errorWrapper.js @@ -1,5 +1,12 @@ +const { validationResult } = require('express-validator') +const errorGenerator = require('./errorGenerator') + const errorWrapper = (controller) => async (req, res, next) => { try { + const errors = validationResult(req) + console.log(errors) + if (!errors.isEmpty()) errorGenerator({ statusCode: 400 }) + await controller(req, res, next) } catch (err) { next(err) diff --git a/middlewares/validateToken.js b/middlewares/validateToken.js index 1164e3f..aa01009 100644 --- a/middlewares/validateToken.js +++ b/middlewares/validateToken.js @@ -8,7 +8,6 @@ const validateToken = errorWrapper(async (req, res, next) => { const { id } = jwt.verify(token, AUTH_TOKEN_SALT) const foundUser = await UserService.findUser({ id }) - if (!foundUser) errorGenerator({ statusCode: 404, message: 'user not found' }) req.foundUser = foundUser diff --git a/package-lock.json b/package-lock.json index fdd9b28..8af416b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -519,6 +519,15 @@ "vary": "~1.1.2" } }, + "express-validator": { + "version": "6.9.2", + "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-6.9.2.tgz", + "integrity": "sha512-Yqlsw2/uBobtBVkP+gnds8OMmVAEb3uTI4uXC93l0Ym5JGHgr8Vd4ws7oSo7GGYpWn5YCq4UePMEppKchURXrw==", + "requires": { + "lodash": "^4.17.20", + "validator": "^13.5.2" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -840,6 +849,11 @@ "package-json": "^6.3.0" } }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, "lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -1478,6 +1492,11 @@ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, + "validator": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.5.2.tgz", + "integrity": "sha512-mD45p0rvHVBlY2Zuy3F3ESIe1h5X58GPfAtslBjY7EtTqGquZTj+VX/J4RnHWN8FKq0C9WRVt1oWAcytWRuYLQ==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/package.json b/package.json index 4675abe..9a43f0a 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "bcryptjs": "^2.4.3", "dotenv": "^8.2.0", "express": "^4.17.1", + "express-validator": "^6.9.2", "jsonwebtoken": "^8.5.1", "morgan": "^1.10.0" }, diff --git a/routes/UserRouter.js b/routes/UserRouter.js index 172a25c..6c51e61 100644 --- a/routes/UserRouter.js +++ b/routes/UserRouter.js @@ -1,9 +1,20 @@ const express = require('express') const router = express.Router() +const { body } = require('express-validator') const { UserController } = require('../controllers') -router.post('/login', UserController.logIn) -router.post('/signup', UserController.signUp) +router.post( + '/login', + body('email').isEmail(), + body('password').isLength({ min: 5 }), + UserController.logIn +) +router.post( + '/signup', + body('email').isEmail(), + body('password').isLength({ min: 5 }), + UserController.signUp +) module.exports = router