작업 노트

페이지 버그 수정 및 post의 index action 수정 본문

javascript/w3schools nodejs

페이지 버그 수정 및 post의 index action 수정

달빛가면 2017. 2. 23. 11:13

전체 소스코드 : https://github.com/imtaekh/my_app/tree/67eed1c385feb374d86c9f16f97c814e82a4ab9c

테스트 사이트 : https://azure0777board.herokuapp.com


다음 포스팅에 검색기능을 추가해 볼텐데, 그 전에 자잘한 몇가지 수정이 있습니다.


1.  기능 수정

- URL 상에 ~/posts&page=1와 같이 query에 페이지를 입력받아서 해당 페이지로 이동하는데, ~/posts 처럼 page query를 입력하지 않은 경우 현재 페이지가 굵은 글씨로 표시되지 않던 버그가 수정됐습니다.(또한 게시물 클릭시 page=NaN query가 추가되는 버그도 수정됐습니다)

- URL query에 limit를 추가하여 한 페이지에 표시되는 게시물 수를 변경할 수 있습니다.(이 전에는 10개로 고정이였습니다.)

- 게시물 클릭시 page query만 전달하는 것이 아니라 모든 query를 전달합니다.


2. 코드상 수정

- posts의 index action에 async waterfall을 사용합니다.



routes/posts.js


10, 11번째 줄 : 각각 query가 양수인 경우 숫자로 저장하고, 아닌 경우 기본값을 사용합니다. parseInt를 하지 않으면 값이 string으로 저장되어 +연산시 문자열이 되어버립니다. 예를 들어 1+"1"은 2가 되는 것이 아니라 "11"이 됩니다. 이전엔 이부분이 없어서 버그가 있었죠.


13~37번째 줄 : 카운터 데이터를 찾고, 게시물 카운트를 하고, 게시물을 찾는 과정을 순차적으로 진행하게 하였습니다.

mongoose 함수들은 기본적으로 비동기(async)입니다. 


즉 함수들을 

Counter.findOne({name:"vistors"}, function (err,counter) {...

Post.count({},function(err,count){...

Post.find({})....

으로 나열하면 Counter.findOnePost.countPost.find의 함수가 순서대로 진행되는 것이 아니라 한번에 동시에 진행됩니다.

특히 Post.countPost.find는 Post.count의 결과값을 이용해서 Post.find에 skip값을 전달해 줘야 하는데, 이전에는


Post.count({},function(err,count){

    ...

    Post.find({})....

}

이렇게 Post.count안에 Post.find을 넣어서 사용했는데요, 작성자 검색을 위해 mongoose를 한번 더 호출하게 되면 3단계로 깊어지게 되어서 async package를 사용했습니다.

async는 이전에도 한번 설명한 적이 있습니다.(http://blog.naver.com/azure0777/220600732194)


31번째 줄 : req._parseUrl.query를 사용해서 전체 url query를 전달해 줍니다. req._parseUrl.query에 전체 url query가 저장되어 있는지 어떻게 아냐면..

console.log(req)해 보시면 이 안에 뭐가 들어 있는지 전체를 볼 수 있어요. 한번 해보세요^^

아래는 이전에 page를 전달해 주던 부분을 urlQuery로 바꾼 부분들입니다.




페이지만 전달하는게 아니라 query 전체를 전달하기 때문에, pagination에서는 이 query를 바꿔줘야합니다.

56번째 줄은 regex를 사용해서 query에 page=<value>부분을 지우는 부분입니다. 왜냐면 61번째 줄에 page를 넣어주기 때문이죠.



regex를 모르는 분들을 위해 간략히 설명하자면, 문자열에서 조건을 줘서 원하는 부분을 선택하는 식입니다. /<regex식>/<options>로 구성되며 option은 생략될 수 있습니다.


56번째 줄에서 /page=(.*?)(&|$)/ig 이 regex인데요, 일단 뒤에 option부터 살펴보면,

i : 대소문자를 무시함(ignore)

g : 조건에 맞는 모든 부분을 찾음(global) g가 없으면 하나만 찾습니다.


regex는 page=(.*?)(&|$)

page= : "page="를 찾음

.*? : 임의의 문자의 반복

& : "&"를 찾음

| : or

$ : 문자열의 끝

(): 그룹

입니다.

regex는 한글자씩 검사를 하게 되는데 그룹은 그 한글자가 어떻게 되는지 여러가지 조건을 넣을 수 있습니다.

&는 특수기능이 아니라 &문자를 찾으라는 거니까 (&|$)는 &이거나 문자열의 끝을 나타내고,

(.*?)는 임의의 문자인데 한글자가 아니라 반복을 나타냅니다.

즉, page=로 시작하고, 임의의 문자가 반복된 후, &이거나 문자열의 끝인 부분을 찾는 regex입니다.


regex는 처음 접하면 정말 어렵게 느껴지는데요,  웹개발에 유용하게 쓰이니 꼭 공부하세요.

주로 사용자가 입력한 값이 이메일이 맞는지 아닌지 판별, 전화번호가 맞는지 아닌지 판별, password가 주어진 조건에 맞는지 등에 주로 쓰입니다.


다음은 게시판 검색입니다.


'javascript > w3schools nodejs' 카테고리의 다른 글

게시판 검색 - 작성자  (0) 2017.02.23
게시판 검색 기능  (0) 2017.02.23
사이트 방문자 count  (0) 2017.02.23
게시판 페이징 추가  (0) 2017.02.23
게시판 웹 호환성 수정  (0) 2017.02.23
Comments