๐ฅ์ํฉ
๊ฐ์ธ๊ณผ์ ๋ฅผ 1์ฐจ์ ์ผ๋ก ์์ฑํ๊ณ ๊ณต์ ํ์๋,
์๋ฌ์ฒ๋ฆฌ์ ๋ํ ๋ถ๋ถ์ ๋ฐ๋ก ๋ฏธ๋ค์จ์ด๋ก ๋นผ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค๋ ๋ง์ ๋ค์๋ค.
์๋ฌ์ฒ๋ฆฌ๋ฅผ ๋ฏธ๋ค์จ์ด๋ก ๋ฐ๋ก ๋นผ๊ฒ๋๋ฉด, ๋ชจ๋ ์๋ฌ๋ฅผ ํ๋ฒ์ ๊ด๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ด๊ณ ,
๋์ผํ ์๋ฌ๋ฅผ ์ฌ๋ฌ๋ฒ ๋ฐ์ํ๋ ๊ฒฝ์ฐ, ๊ฐ์ ํจ์๋ก ์ฌ๋ฌ๋ฒ ์ฌ์ฌ์ฉ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๐ค ์๋
์ผ๋จ ์๋ฌ์ฒ๋ฆฌ ๋ฏธ๋ค์จ์ด๋ฅผ ๊ตฌํํ๊ธฐ ์์ next ๋ผ๋ ์ ๋ฅผ ์ดํดํด์ผ ํ๋ค.
next() : ๋ฏธ๋ค์จ์ด ์๋์ ์์ด์ ๋ค์์ผ๋ก ๋๊ธฐ๋ ์ญํ ์ ํ๋ค.
try ๋ฌธ์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ
throw ๋ฅผ ํตํด ํน์ ์๋ฌ๋ฅผ ๋๊ธธ ์ ์๋ค.
๊ทธ๋ผ catch๋ฌธ์์ ๋์ก๋ ์๋ฌ๋ฅผ ๋ฐ์์ next๋ก ๋ค์ ๋ฏธ๋ค์จ์ด๋ก ๋๊ฒจ์ค๋ค.
๋ฏธ๋ค์จ์ด๋ก ๋์ด๊ฐ ์๋ฌ๋ ๊ฐ ์๋ฌ์ ํด๋นํ๋ ๋ฉ์ธ์ง๋ฅผ ๋ด๋ณด๋ธ๋ค.
์ํ ์์ ํ๋ ๋ผ์ฐํฐ๋ฅผ ์๋ก ๋ค์ด๋ณธ๋ค.
์๋์ ์์์ฒ๋ผ ์ธ์๋ก req, res, next๋ฅผ ์ฃผ๊ณ ,
๋ง์ฝ ํ๋์ค์ ํด๋นํ๋ ์ํ์ด ์๋ ๊ฒฝ์ฐ, ProductDosntExistError() ๋ฅผ ์์ฑ์ ํจ์๋ก ๋ง๋ค์ด throw๋ก ๋๊ฒจ์ค๋ค.
//์ํ ์์ ํ๊ธฐ
router.patch('/product/:id', authMiddleware, newProductValidation, async (req, res, next) => {
try {
const { product_name, comment, status, price } = req.body;
const { id } = req.params;
const willModifyData = await Product.findOne({ where: { id } });
if (!willModifyData) {
throw new ProductDosntExistError();
}
const writerId = willModifyData.user_id;
const userId = res.locals.user.id;
if (writerId !== userId) {
throw new NoPermissionError();
}
await Product.update({ product_name, comment, status, price }, { where: { id } });
return res.status(200).json({ message: '์ํ์ด ์์ ๋์์ต๋๋ค.' });
} catch (err) {
next(err);
}
});
์ด new ProductDosntExistError()๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ,
ํด๋น ํ์ผ์ ์๋จ์, require ํน์ import๋ฅผ ํด์์ผ ํ๋ค.
๋ํ, ์ด๋์ ๊ฐ exports๋ฅผ ํด์ค์ผ ํ๋๋ฐ,
๋์ ๊ฒฝ์ฐ, CustomError.js ๋ผ๋ ํ์ผ์ ๋ง๋ค์ด,
Error๋ก ๋ถํฐ ์์ class๋ฅผ ๋ง๋ค์ด ๊ทธ ์ด๋ฆ์ ์ง์ ํด ์ฃผ๊ณ ,
ํด๋น ์ด๋ฆ์ ํด๋นํ๋ ๊ฒฝ์ฐ, ์๋ฌ๋ฉ์ธ์ง๋ฅผ ๊ฐ๊ฐ์ ๋ง๊ฒ ์ง์ ํด ์ฃผ์๋ค.
CustomError.js ํ์ผ
class ProductDosntExistError extends Error {
constructor(message) {
super(message);
this.name = 'ProductDosntExistError';
}
}
class NoPermissionError extends Error {
constructor(message) {
super(message);
this.name = 'NoPermissionError';
}
}
module.exports = {
ProductDosntExistError,
NoPermissionError
};
ErrorHandler.js ํ์ผ
const ErrorHandler = (err, req, res, next) => {
if (err.name === 'ProductDosntExistError') {
return res.status(400).json({ success: false, erroerMessage: '์กด์ฌํ์ง ์๋ ์ํ์
๋๋ค.' });
}
if (err.name === 'NoPermissionError') {
return res.status(400).json({ success: false, erroerMessage: '์์ฑ์๊ฐ ์๋์ผ๋ก ๊ถํ์ด ์์ต๋๋ค.' });
}
res.status(500).json({ success: false, erroerMessage: '์ฐ๊ฒฐ์ ์คํจํ์์ต๋๋ค. ์ ์ํ ๋ค์ ์๋ํด ์ฃผ์ธ์.' });
};
module.exports = ErrorHandler;
๋ง์ง๋ง์ผ๋ก ์ด๊ฒ๋ค์ ์ฌ์ฉํ๊ธฐ ์ํ ์ ์ฒด์ ์ธ ์ค์ ์ app.js์์ ์งํํ๋ค.
ํ์ฌ ์ฌ์ฉํ๋ ๋ผ์ฐํฐ๋ค ๋ฐ๋ก ํ๋จ์ ,
app.use()๋ก ๋ง๋ค์๋ ErrorHandler ํ์ผ์ ๊ฐ์ ธ์์ ๊ดํธ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
const UserRouter = require('./routers/user.router.js');
const ErrorHandler = require('./middleware/ErrorHandler.js');
app.use('/api', [UserRouter, ProductRouter]);
app.use(ErrorHandler);
์ด๋ ๊ฒ ํด์ ์๋ฌ๋ฅผ ์ปจํธ๋กค ํ๋, ๋์ผํ ๊ฒฝ์ฐ์ ๊ฐ๊ฐ ์จ์ค ํ์ ์์ด,
์์ฑ์ ํจ์๋ง ํ๋ ์์ฑํด ์ฃผ๋ฉด ๋์ด๋ผ ๊ฐํธํ๋ค.!!!
ํ๋ก์ ํธ๊ฐ ํฌ๊ณ , ์๋ฌ ํจ๋ค๋ฌ ํ ๊ฒ ๋ง์ ์๋ก ํธํ๊ฒ ์ฌ์ฉํ ์ ์์ ๊ฒ ๊ฐ์๋ค.
๋ํ next์ ๋ํด ์ ๋งคํ๊ฒ ์๊ณ ์์๋๋ฐ,
์ด๋ฒ ๊ธฐํ์ ํ์คํ๊ฒ ์ฌ์ฉํด ๋ณด๋ฉด์ ์ข๋ ๋ง์ด ์ดํดํ๊ฒ ๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ฌ๋ ๋ฌด์กฐ๊ฑด ์ด ๋ฐฉ๋ฒ์ผ๋ก ์๋ฌ์ฒ๋ฆฌ๋ฅผ ํด์ผ๋ง ํ๋๊ฐ์ ๋ํด ๊ณ ๋ฏผํด ๋ณด์๋ฉด,
์๋ฌ๊ฐ ๋ง์ด ๊ฒน์น์ง ์๊ณ , ์๋ฌ๊ฐ ์ ์๋ฐ, ํ์ฅ๊ฐ๋ฅ์ฑ๋ ์๋ ๊ฒฝ์ฐ์๋
๊ตณ์ด ์ฐ์ง ์์๋ ๋ ๊ฒ ๊ฐ์๋ค.