elice/WIL
[week_06] asyncHandler, Pagination, PM2 Process Manager
๊ฑด๋ง๋
2022. 2. 18. 18:25
1. asyncHandler
- request handler๋ฅผ async function์ผ๋ก ์์ฑํ๋ฉด์ try ~ catch, next๋ฅผ ์๋์ผ๋ก ํ ์ ์๋๋ก ๊ตฌ์ฑํ ์์ด๋์ด
- requestHandler๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๊ฐ๋ ํจ์ํ ๋ฏธ๋ค์จ์ด
- ์ ๋ฌ๋ requestHandler๋ try ~ catch๋ก ๊ฐ์ธ์ ธ asyncHandler ๋ด์์ ์คํ
- throw๋๋ ์๋ฌ๋ ์๋์ผ๋ก ์ค๋ฅ์ฒ๋ฆฌ ๋ฏธ๋ค์จ์ด๋ก ์ ๋ฌ๋๋๋ก ๊ตฌ์ฑ๋จ
const asyncHandler = (requestHandler) => {
return async(req, res, next) => {
try {
await requestHandler(req, res);
} catch(err) {
next(err);
}
}
}
// ---------------------------------------
router.get('/', asyncHandler(async (req, res) => {
const posts = await Posts.find({});
if(posts.length < 1) {
throw new Error('Not Found');
}
res.render('posts/list', {posts});
});
2. Pagination
- ๋ฐ์ดํฐ๋ฅผ ๊ท ์ผํ ์๋ก ๋๋์ด ํ์ด์ง๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ
rouger.get(... => {
// ํ์ฌ ํ์ด์ง
const page = Number(req.query.page || 1)
// ํ์ด์ง ๋น ๊ฒ์๊ธ ์
const perPage = Number(req.query.perPage || 10)
})
- ์ผ๋ฐ์ ์ผ๋ก url query๋ฅผ ์ฌ์ฉํด ์ ๋ฌ ๐ /posts?page=1&perPage=10
- MongoDB์ limit๊ณผ skip์ ์ฌ์ฉํ์ฌ pagination ๊ตฌํ ๊ฐ๋ฅ
router.get(... => {
...
const total = await Post.countDocument({});
const posts = await Post.find({})
.sort({createdAt: -1})
.skip(perPage * (page -1))
.limit(perPage);
const totalPage = Math.ceil(total / perPage);
...
})
- limit = ๊ฒ์ ์ ์ ํ (perPage)
- skip = ๊ฒ์ ์ ํฌํจํ์ง ์์ ๋ฐ์ดํฐ ์
- pagination ์์๋ ๋ฐ์ดํฐ์ ์์๊ฐ ์ ์ง๋ ์ ์๋๋ก sort๋ฅผ ์ฌ์ฉ
- ๊ฒ์๊ธ ์ / ํ์ด์ง ๋น ๊ฒ์๊ธ ์ = ์ด ํ์ด์ง ์
mixin pagination(path)
p
- for (let i = 1; i <= totalPage; i++)
a(href=`${path}?page=${i}&perPage=${perPage}`)
if i == page
b= i
else
= i
= " "
// --------
include pagination
tr
td
+pagination("/posts")
- pagination์ mixin์ผ๋ก ์ ์ธ
- pagination์ด ํ์ํ ํ์ด์ง์์ ํด๋น ํ ํ๋ฆฟ์ includeํ ํ, +pagination์ผ๋ก mixin์ ์ฌ์ฉํจ
- ํ์ฌ ํ์ด์ง๋ bํ๊ทธ๋ก ๊ตต๊ฒ ํ์
3. PM2 Process Manager
- Node.js์ ์์ ์ ๊ด๋ฆฌํด์ฃผ๋ Process Manager
- ์์ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ค์ํ๊ณ ์ ์ฉํ ๊ธฐ๋ฅ ์ ๊ณต
- ์์ ์ ์ธ ํ๋ก์ธ์ค ์คํ, ๋น ๋ฅธ ๊ฐ๋ฐํ๊ฒฝ, ๋ฐฐํฌ ์ ํธ๋ฆฌํ ๊ด๋ฆฌ ๋ฑ์ ์ฅ์
module.exports = {
apps : [{
name: 'simple-board', // ์คํ๋๋ ํ๋ก์ธ์ค ์ด๋ฆ ์ค์
script: './bin/www', // ์คํ๋๋ ์คํฌ๋ฆฝํธ, =npm start
watch: '.', // ํ์ฌ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ ๋ถ ๋ฐ๋ผ๋ณด๊ฒ ๋ค
ignore_watch: 'views', // views ๋๋ ํฐ๋ฆฌ ์์ ๋ถ๋ถ๋ค์ ๋ณ๊ฒฝ ๋์ด๋ ํ๋ก์ ํธ ์ฌ์คํ x
}],
};
$ pm2 start
- $ pm2 init simple ํน์ pm2 init ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ์ฌ pm2 ์ค์ ํ์ผ ์์ ๋ฅผ ๋ง๋ค ์ ์๋ค.
- ์์ ๋ฅผ ์์ ํ์ฌ ์ค์ ํ์ผ ์์ฑํ pm2 start ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด ์ดํ๋ฆฌ์ผ์ด์ ์ pm2 ๋ฐ๋ชฌ์ผ๋ก ์คํ
- ๊ฐ๋ฐ ์ watch ์ต์ ์ฌ์ฉํ์ฌ ํ์ผ ๋ณ๊ฒฝ ์ ์๋ฒ ์๋ ์ฌ์คํ ๊ตฌ์ฑ