티스토리 뷰

Node.js
Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.
nodejs.org
Async Request Handler
▶ request handler의 오류처리 방법
- promise().catch(next)
- async function, try ~ catch, next
▶ async request handler
async의 비동기 처리는 매우 편리하지만 매번 try - catch 구문을 작성하는 것은 귀찮고 실수하기 쉬움
→ request handler를 async function으로 작성하면서 try ~ catch, next를 자동으로 할 수 있도록 구성한 아이디어
const asyncHandler = (requestHandler) => {
return async (req, res, next) => {
try {
await requestHandler(req, res);
} catch (err) { // 3. 여기서 catch되서
next(err); // 4. 오류처리 미들웨어로 전달됨
}
}
}
---
router.get('/', asyncHandler(async (req, res) => { // 1. requestHandler에서
const posts = await Posts.find({});
if (posts.length < 1) {
throw new Error('Not Found'); // 2. 오류가 발생하면
}
res.render('posts/list', { posts });
});
- asyncHandler 는 requestHandler를 매개변수로 갖는 함수형 미들웨어
: 전달된 requestHandler는 try ~ catch로 감싸져 asyncHandler내에서 실행되고, throw 되는 에러는 자동으로 오류처리 미들웨어로 전달되도록 구성됨
Pagination
▶ Pagination 이란?
데이터가 많아지면 한 페이지의 목록에 모든 데이터를 표현하기 어려움
→ Pagination은 데이터를 균일한 수로 나누어 페이지로 분리하는 것
(ex. 10개씩 나누어 1페이지에는 1~10번까지, 2페이지엔 11~20번까지 보여주기)
Express.js + Mongoose의 Pagination
router.get(... => {
const page = Number(req.query.page || 1)
const perPage = Number(req.query.perPage || 10)
...
- page : 현재 페이지
- perPage : 페이지 당 게시글 수
"/posts?page=1&perPage=10" → 일반적으로 url query 를 사용해 전달
( ! query는 문자열로 전달되기 때문에 Number 로 형변환이 필요)
router.get(... => {
...
const total = await Post.countDocument({}); // 총 게시글 수 count
const posts = await Post.find({}).sort({ createdAt: -1 }) // 데이터 생성시간 역순으로 정렬 (최신순 정렬)
.skip(perPage * (page - 1)) // perPage가 10이면 -> 1page는 skip 0개(data0~9), 2page는 skip 10개(data10~19), ...
.limit(perPage);
const totalPage = Math.ceil(total / perPage);
...
- MongoDB 의 limit과 skip을 사용하여 pagination 구현 가능
- limit : 검색 결과 수 제한 (한 페이지에 보일 자료의 개수 제한)
- 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 태그로 굵게 표시
PM2 Process Manager
▶ PM2 란?
: Node.js 작업을 관리해주는 Process Manager
node 명령어로 실행 시 오류 발생이나 실행상태 관리를 할 수 없음
→ pm2 는 작업 관리를 위한 다양한 유용한 기능을 제공
▶ PM2를 사용하는 이유
- 안정적인 프로세스 실행 : 오류발생 시 자동 재실행
- 빠른 개발환경 : 소스 코드 변경 시 자동 재실행
- 배포 시 편리한 관리 : pm2 에 모든 프로세스를 한 번에 관리
▶ PM2 사용 방법
1) 명령어를 이용하여 pm2 설정파일 예제를 만들 수 있음
pm2 init simple 혹은 pm2 init
2) 예제를 수정하여 설정파일을 생성한 후
pm2 start 명령어를 실행하면 어플리케이션을 pm2 데몬으로 실행
3) 개발 시 watch 옵션 사용하여 파일 변경 시 서버 자동 재실행 구성
module.exports = {
apps : [{
name: 'simple-board',
script: './bin/www',
watch: '.',
ignore_watch: 'views',
}],
};
---
$ pm2 start

이 글은 엘리스 AI트랙 5기 강의를 들으며 정리한 내용입니다.
'개발공부 > 🟩 Node.js' 카테고리의 다른 글
| [NodeJS] Express와 MongoDB로 웹서비스 만들기 - 2 (2) (0) | 2022.08.05 |
|---|---|
| [NodeJS] Express와 MongoDB로 웹서비스 만들기 - 2 (1) (0) | 2022.08.04 |
| [NodeJS] Express와 MongoDB로 웹서비스 만들기 - 1 (1) (0) | 2022.08.02 |
| [NodeJS] Mongoose ODM (0) | 2022.07.31 |
| [NodeJS] Node.js와 MongoDB (0) | 2022.07.31 |
프론트엔드 개발자 삐롱히의 개발 & 공부 기록 블로그