๐ค try/catch ์์ด expressJs์์ ๋น๋๊ธฐ ์ค๋ฅ ์ฒ๋ฆฌ!
9798 ๋จ์ด webdevnodebeginnersjavascript
๊ฒฝ๋ก ์ฒ๋ฆฌ๊ธฐ ๋ฐ ๋ฏธ๋ค์จ์ด ๋ด๋ถ์ ๋๊ธฐ ์ฝ๋์์ ๋ฐ์ํ๋ ์ค๋ฅ๋ ์ถ๊ฐ ์์ ์ด ํ์ํ์ง ์์ต๋๋ค. ๋๊ธฐ ์ฝ๋์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด Express๊ฐ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค.
๋ค์ ์ฝ๋๋ ๋ชจ๋ ๋๊ธฐ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋ ๊ฐ ์์ ์ด ์คํ๋๊ธฐ ์ ์ ์ด์ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก express๋ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ์ ํจ๊ป ์ ๊ณต๋ฉ๋๋ค.
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.status(200).send('Hello World!')
})
// Error handler for synchronous errors
// This should be the last middleware in the chain
app.use((err, req, res, next) => {
console.error(err.stack)
res.status(500).send('Something broke!')
})
app.listen(port, () => {
console.log(`Example app
listening on port ${port}`)
})
๊ทธ๋ฌ๋ ๋๋ถ๋ถ์ ๋ฐฑ์๋๋ ์ผ๋ถ db ์์ ์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ ํญ์ ๋น๋๊ธฐ์์ ๋๋ค. ์ฆ, ์ด์ ์์ ์ด ์๋ฃ๋๊ธฐ ์ ์ ๋ค๋ฅธ ์์ ์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค.
๐คจ ๊ทธ๋ ๋ค๋ฉด ์ต์คํ๋ ์ค์์ ๋น๋๊ธฐ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
ํ ๊ฐ์ง ๊ฐ๋จํ ํด๊ฒฐ์ฑ ์ try/catch๋ฅผ ์ฌ์ฉํ๊ณ catch ๋ธ๋ก์์ next()๋ฅผ ํธ์ถํ๋ ๊ฒ์ ๋๋ค.
next()๋ฅผ ํธ์ถํจ์ผ๋ก์จ ์ฐ๋ฆฌ๋ ์ต์คํ๋ ์ค๊ฐ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๊ณ ๊ทธ์ ๋ฐ๋ผ ์๋ตํ๋๋ก ์ง์ํฉ๋๋ค.
์์ ๋ ๋ฒ์ ์ ๊ฒฝ๋ก๊ฐ ๋ฉ๋๋ค.
app.get('/', (req, res, next) => {
try {
// some db asyncrhonous operations
res.status(200).send('Hello World!')
}
catch(error) {
next(error)
}
})
next(์ค๋ฅ)๋ ์ฐ๋ฆฌ์ ๊ธฐ๋ณธ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฏธ๋ค์จ์ด๋ฅผ ํธ์ถํ ๊ฒ์ด๊ณ ์ฐ๋ฆฌ์ ๊ฒฐ๊ณผ๋ ์๋ง์ด ๋ ๊ฒ์ ๋๋ค! ์ค๋ฅ๊ฐ ๋ฐ์ํ ๋.
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ ์ฑ์ ํ๋์ ๊ฒฝ๋ก๋ก๋ง ๊ตฌ์ฑ๋์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋จ์ง ์ฑ์ฅํ ๊ฒ์ด๊ณ ์ฐ๋ฆฌ๋ ๋ฏธ๋์ ์ฐ๋ฆฌ๋ฅผ ๋๋ผ๊ฒ ํ ์ ์๋ ์ด๋ค ์ค๋ฅ๋ ๋์น๊ณ ์ถ์ง ์์ต๋๋ค.
We will make something interesting without try/catch.
๊ทธ๋์ ์ฐ๋ฆฌ๋ ๋ชจ๋ ๋น๋๊ธฐ(์ด์์ ์ผ๋ก๋ ์ฝ์)๋ฅผ ์ฒ๋ฆฌํ๊ณ ๊ฑฐ๋ถ ์ next()๋ฅผ ํธ์ถํ๋ promiseHandler ํจ์๋ฅผ ๋ง๋ค ๊ฒ์ ๋๋ค.
ํ ์ค์
const promiseHandler = () => (req, res, next) => {
Promise.resolve(fn(req, res, next)).catch(next)
}
// and route becomes
app.get('/', promiseHandler (async (req, res, next) => {
// some db asyncrhonous operations
res.status(200).send('Hello World!')
}))
์ด ํ๋ก๋ฏธ์ค ํธ๋ค๋ฌ ํจ์๋ ๋น๋๊ธฐ ํจ์๋ฅผ ์ธ์๋ก ์ฌ์ฉํ๊ณ ์ฑ๊ณตํ๋ฉด ํด๊ฒฐํ๊ฑฐ๋ ์ค๋ฅ๊ฐ ์์ผ๋ฉด ์ฝ๋ฐฑ ํจ์๋ก ๋ค์์ ํธ์ถํฉ๋๋ค.
์ผ๋ถ ์ค๋ฅ๋ฅผ ํดํนํ๊ณ ํ ์คํธํ๋ ค๋ฉด ๋ค์ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ์ญ์์ค. nodejs-error-handler
๋ด TypeScript ์ฌ์ฉ์๋ฅผ ์ํด Promise ํธ๋ค๋ฌ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
import { NextFunction, Request, Response } from "express";
type fnType = (req : Request, res : Response, next : NextFunction) => void;
const promiseHandler = (fn: fnType) =>
(req : Request, res : Response, next : NextFunction) => {
Promise.resolve(fn(req , res , next)).catch(next)
}
export default promiseHandler
nodejs์ ๊ด์ฌ์ด ์๋ค๋ฉด ์๊ณ ์ถ์ ์๋ ์์ต๋๋ค.
๊ฐ๋๋ก ์์ํ๋ ๊ฒฝ์ฐ ๋ด๊ฐ ๊ฐ๋์์ ๋ง๋ ์ค์๋ฅผ ์๊ณ ์ถ์ ์๋ ์์ต๋๋ค.
๐ธ ๋น์ ์ ์ ์ง ์น ๊ฐ๋ฐ์์ด๋ฉฐ ๋ฐฉ๋ฌธ์์ ๋ฐฐ์ธ ๋ฉ์ง CSS ์น์ฌ์ดํธ๊ฐ ํ์ํ์ญ๋๊น?
์ง์์ ํฅ์์ํค๊ธฐ ์ํด ์ด๋ฌํ ์ ํ์ ์์ ๊ธฐ์ฌ๊ฐ ๋ง์์ ๋ค๋ฉด dev.to๋ฅผ ํ๋ก์ฐํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค. ๋ ๋ง์ด ์์ฑํ๊ณ ์คํ ์์ค์ ๊ธฐ์ฌํ๋๋ก ๋๊ธฐ๋ฅผ ๋ถ์ฌํฉ๋๋ค.
๐ ํํ!
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ค try/catch ์์ด expressJs์์ ๋น๋๊ธฐ ์ค๋ฅ ์ฒ๋ฆฌ!), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/shrihari/handle-asynchronous-errors-on-expressjs-without-trycatch--1e5bํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค