Scenario


NodeJS의 npm 모듈중 passport를 쓰면서, 분명히 가이드라인대로 했는데 안되는 게 좀 있엇다. 다들 어이없는 이유로 안됬는데, 이런거땜에 1~2시간은 족히 소요되는 것 같다.

 

1.Passport 사용시 Client에서 서버로 요청까지는 보내지는데 authenticate 에서 passReqToCallback로 진입이 안되는 상황.


2.bcrypt.compareSync(password, this.local.password) 함수로 비밀번호 비교 하련는데, cannot read property 'password' of not undefined 라고 뜨는 상황


3.(가장 어이없음 주의**) req.flash를 사용헤 flash 메세지를 얻어오려는데 못얻어오는 상황.


Solution


1.Passport 사용시 Client에서 서버로 요청까지는 보내지는데 authenticate 에서 passReqToCallback로 진입이 안되는 상황.

->View 에서 보낼때 name과 passport의 usernameField,passwordField 가 일치해야한다.

ex)내가 오류났던 상황

JavaScript 0.45 KB

  1. -----------------view---------------------  
  2.       <div>
  3.         <label>Id:</label>
  4.         <input type="text" name="id"/>
  5.       </div>
  6.       <div>
  7.         <label>Password:</label>
  8.         <input type="password" name="password"/>
  9.       </div>
  10.  
  11.  
  12.  
  13. -----------------------server------------------------------
  14.   passport.use('login',new LocalStrategy({
  15.     usernameField:'email',
  16.     passwordField:'password',
  17.     passReqToCallback : true
  18.   },



2.bcrypt.compareSync(password, this.local.password) 함수로 비밀번호 비교 하련는데, cannot read property 'password' of not undefined 라고 뜨는 상황

->아주 단순했다 this.local.password를 this.password 로 바꿔주니 잘 동작했다.



3.(가장 어이없음 주의**) req.flash를 사용헤 flash 메세지를 얻어오려는데 못얻어오는 상황.

https://stackoverflow.com/questions/38136792/typeerror-req-flash-is-not-a-function

이유를 알고나서 정말 어이가 없었는데.

passReqToCallback:true 를 쓸때 나는 띄어쓰기가 상관 없는줄 알았다. 왜냐하면 다른필드도 띄어쓰기를 안해도 상관 없었으니까.

그러나 passReqToCallback : true 무조건 이런식으로 띄어쓰기를 해주어야한다.

명심하자

passReqToCallback^:^true

Scenario


몽고 DB에서 파일 형식 JSON Array를 꺼내와서, EJS단에서 꺼내서 쓸려고 했다.

서버에서 EJS로 보낸 JSON을 자바스크립트 파일에 담으니 자꾸 

ex)

<Script>

var fileArrys = <%= board.files%>

<script>


Invalid or unexpected token 이라는 에러가 뜨는 것이었다





Solution


다행히도 나와 비슷한 오류를 겪고있는 사람들이 스택오버플로우에 많았다.


JavaScript 0.10 KB

  1. var initData = JSON.parse('<%-JSON.stringify(list)%>');
  2. //or
  3. var initData = <%-JSON.stringify(list)%>;


이렇게 써서 간단히 해결!!

Scenario


 스프링으로 개발하다보면, URL 뒤에 /value=hi&id=nana0303

이런식으로 string을 쓰면 서버측에서 HandlerMethodArgumentResolver 등록해놨다면 바로바로 맵에서 Parameter 들을 꺼내 쓸 수 있엇다.

그래서 nodejs에서도 /down/value=hi&id=nana0303  이런식으로 보낸뒤 (나는 당연히 JSON 형식으로 갈꺼라 생각)

router.get('/download/:Params', function(req, res){

req.params.Params.storedname

}

서버에서 이렇게 꺼내쓰면 될 줄알았다. 하지만 params 은 긴 스트링으로 인식 되는 것이었다.



Solution


역시 NodeJs에서는 querystring 이라는 모듈로 제공 하고 있었다.

다음과 같이 쓰면 내가 원하는 결과를 얻을 수 있엇다.

JavaScript 0.26 KB

  1. var querystring = require('querystring');
  2. //file down
  3. router.get('/download/:Params', function(req, res){
  4.     var Params = querystring.parse(req.params.Params);
  5.     console.log("path: %s",JSON.stringify(Params, null, " "));
  6.     res.download('./'+downPath+Params.storedname, Params.originFileName);
  7. });




개요


 스프링을 공부하고 회사에서도 스프링을 다룬다. 그러나 스프링의 심오함은 파도파도 끝이 없는 것 같다. 결정적으로 새로운 언어의 학습 필요성을 느낀 때가 있엇다. 

 Cloud 서비스 및 빅데이터 강의를 연수원에 있을때 들은 적이 있는 데, 강사님과 Back-End와 Front-End에 대해서 이야기를 나눈 적이 있엇다.

 강사님 왈 "한국에서는 백엔드 하면 무조건 JSP,Servlet(스프링) 인데 이미 외국은 노드제이에스 파이썬 장고로 많이 넘어갔어요. 미리미리 준비해두세요." 이런식으로 말씀 하신게 기억이난다.

 그 이후로 nodejs에 대해 조금 스터디를 하고 싶어졌고 하둡 생태계처럼 nodejs도 생태계가 존재하는 것이었다.



그래서 MEAN STACK 이 뭔데??


일단 이 그림부터 보고 가는 게 좋겠다.

 다음과 같은 프로그램의 앞글자를 따서 약자로 쓴 것 인데, 여기서 주목할 만한점은 모든 데이터를 JSON 형태로 주고받는 다는 것이다.

 특히 가히 충격점인점은 DB인데, document 기반(추후 따로 올려야겠다)이다. (몽고디비는 BSON이라고 불리는 바이너리 제이선으로 저장함) 이라는 것이다. RDB의 형식을 파괴하고, 무려 이름은 No-SQL 이다.! 

 물론 오래전부터 주목받았겠지만, 최근에 알게된 나는 JSON으로 프론트에서 디비까지 데이터 변형없이 주고받는게 너무 신선했다. 


장 단점


- 장점

  • 일단 4가지 언어의 공통점은 JavaScript의 뿌리를 가진다. 한 가지 언어로 프론트부터 백단까지 구성!!
  • 굉장히 간단하다. 스프링에 비한다면 가히 폭팔적인 생산성이라고 할 수 있겠다.(코드 짜는 속도가 완전 빠름)
  • 빠르다. 일단 NodeJs가 NonBlocking,Single-Thread를 추구하므로 단점도 있긴 하지만 빠르다. 또한 DOM기반 Jquery에 비해 AngularJS가 훨 씬 빠르다. (물론 어떻게 쓰느냐에 따라 많이 다르다)


- 단점

  • AngularJs는 진입장벽이 확실히 높다. 개인적으로 Jquery는 굉장히 직관적이어서 selector개념만 익힌뒤, 원하는 기능을 왠만하면 다 만들어 낼 수 있엇다. angularjs는 뷰단에서 프레임워크를 구성하기 때문에, 그리고 바인딩 개념때문에 확실히 초반진입장벽이 있다.
  • 한국은 아직까지 JAVA가 대세. 말 그대로 어쩔 수 없는 것 같다. 아직까지 자바공화국 한국에서는 nodejs 기반 프로그래밍은 스타트업에서 쓰이는 정도이다. (나도 자바로 취직을 했다. MEAN stack은 스터디 개념)
  • MongoDb에는 트랜젝션이 없다. 이 부분에서는 좀더 스터디를 하면서 채워나가야 겠다.

결론


 나는 회사원보다는 개발자가 되고싶다. 

언어는 90년대부터 시작해서 굉장히 많이 변해 왔다. 목수나 기술자에게 생산성이 높은 툴이 나온다면, 주저하지 않고 사용법 정도는 익혀놔야 할 것이다. 개발자에게는 더욱 중요 하다. 








+ Recent posts