[개발] nodejs + steem-js 콜백 지옥을 탈출해보자. - synchronize.js 편

in #kr-dev7 years ago



오랜만에 개발 포스팅입니다. 개발 포스팅 해야지, 해야지 하면서 잘 못했는데 좀 더 분발해야겠습니다.

실제로 개발에 들어가기 전에 node.js에 문외한인 경우 무엇부터 해야할까요? 아마 프로젝트의 프레임워크, 디비, 로그설정 등을 먼저 해야할겁니다. 마침 @cheerup 양이 Q&A 활동을 하고 있어서 질문 드려봤습니다. 개발 고수로 보이는 ludorum님께서 친절히 답변을 주셨네요.

답변 전문을 옮길 필요는 없을 것 같구 간추리면 '스팀잇 봇을 개발하는 데는 프라미스 패턴만 사용하면 충분해보인다' 입니다. 내심 nodejs의 콜백 지옥을 벗어나기 위해선 꼭 적용해야겠다는 생각을 하고 있던 터라 알아보았습니다.

콜백지옥은... 뭐냐면...

이렇게 steem-js는 콜백 함수로 데이터를 처리하는데 콜백 함수 내에 처리가 계속 되면서 이런 헬게이트 소스가 만들어진다는 겁니다...

으어... 예시로만 코딩을 넣어봤는데 꼭 디아블로를 만난것 같은 느낌입니다.

요걸 타파하지 않고서는 제대로 코딩을 할수 없겠다는 생각이 듭니다. 내가 원하는건 async 방식의 콜백이 아니라 인터프리터 즉 순차적인 처리였으니까요.

인터넷 검색으로 이것저것 찾아봤는데 이 steem-js를 순차적으로 쓰기위해 @junn님이 예전에 남겨놓으신 글에 synchronize.js를 사용한 후기가 있어 synchronize.js를 해보니 딱 원하는대로 코딩이 진행될 수 있을 것 같습니다. 저 위의 그림이 아래처럼 코딩이 가능해지네요.

비동기식 steem-js api를 동기화된 것처럼 사용할 수 있으니 얼마나 좋은지 모릅니다. 더군다나 콜백 안에 콜백 넣고 그 콜백 안에 콜백을 넣는 헬파티를 안할 수 있다니 기분이 좋아졌습니다.

참고 : synchronize.js

http://alexeypetrushin.github.io/synchronize/docs/index.html

synchronize.js를 사용하기 위해서는 이놈들을 설치해주면 됩니다.

cd [해당 프로젝트 경로]
npm install [라이브러리명] --save

package.json 내용 중 - dependencies
"dependencies": {
    "fibers": "^2.0.0",
    "node-gyp": "^3.6.2",
    "steem": "^0.6.7",
    "synchronize": "^2.0.0"
  }

자. 이쯤 되었을 때 서버에서도 동기화를 시키고 실행해봅시다. 환경 구성 시에 한땀 한땀 해야지 모조리 하고 나서 서버에서 수행했을 때 문제가 복합적으로 터지면 잡기가 더 어렵습니다.

Ctrl + Shift + HAdd All and Commit and Push

역시나 서버에서 git pull로 소스를 받고 node app.js하면 이런 에러메세지를 만나게 되는데... 뭐든 한번에 되는 경우는 더 쉽지 않아보입니다.

root@ip-172-31-9-10:/app/nodejs_test# node app.js
## There is an issue with `node-fibers` ##
`/app/nodejs_test/node_modules/synchronize/node_modules/fibers/bin/linux-x64-57/fibers.node` is missing.

Try running this to fix the issue: /usr/bin/node /app/nodejs_test/node_modules/synchronize/node_modules/fibers/build
/app/nodejs_test/node_modules/synchronize/node_modules/fibers/fibers.js:20
        throw new Error('Missing binary. See message above.');

/app/nodejs_test/node_modules/synchronize 여기 내에 포함된 또 하나의 모듈인 fibers라는 놈의 문제인듯 싶어보입니다. 그래서 /app/nodejs_test/node_modules/synchronize 여기에 node-gyp와 fibers를 지웠다가 재설치 하고 다시 빌드를 수행해주었습니다. ( fibers관련 github 이슈 참고. )

cd /app/nodejs_test/node_modules/synchronize
npm uninstall node-gyp
npm install node-gyp
npm uninstall fibers
npm install fibers
cd /app/nodejs_test/node_modules/synchronize/node_modules/fibers
node build.js

이렇게 하고 서버에서 node app.js를 수행하니 정상적으로 수행이 되었습니다. 물론 중간에 쪼금 삽질을 했지만 중간 삽질 과정은 지면에 싣지 않습니다. ㅎㅎㅎ

root@ip-172-31-9-10:/app/nodejs_test# node app.js
[ { id: 497,
name: 'ned',
--- 생략 ---

위에 화면 캡처로 실은 실제 수행 코드를 첨부합니다.

var steem = require("steem")
steem.api.setOptions({url: 'https://api.steemit.com'});

var sync = require('synchronize');
var fiber = sync.fiber;
var await = sync.await;
var defer = sync.defer;
try {
    fiber(function() {
        var obj = await(steem.api.getAccounts(['ned', 'dan'], defer()));
        console.log(obj);
        obj = await(steem.api.getAccounts(['nhj12311'], defer()));
        console.log(obj);
    });
} catch(err) {
  console.log(err);
}

이제 콜백 헬게이트 없이 steem-js를 활용할 준비가 된것 같습니다. 다음엔 개발 프로젝트에 필수적으로 세팅해야할 로깅 처리를 해보도록 하겠습니다.


지난 회차 살펴보기
nodejs 개발환경을 구성해보자. 윈도우 개발 + Github 저장소 + 리눅스 운영


Sort:  

Cheer Up!

  • from Clean STEEM activity supporter

npm uninstall node-gyp
npm install node-gyp

이걸 하기 전에 파이썬 2.7 버전이 인스톨되어있어야 합니다.

오호 이런 동기화 코딩 같은 라이브러리도 있었군요. 저는 waterfall 이라는 걸 이용해서 동기화 처럼 이용했었거든요. 순서대로 처리되도록 만들어 줬었었지요. 다음에 기회되면 비교해서 어떤게 나은지 한번 보도록 해볼께요~

예. ^^ 저도 워터풀 보긴햇는데 steem.js에는 적용이 안되드라구요. 해보다가 안되서 접엇는데 steem.js에 되나요??

음 저는 스팀에선 아직 안써뵜고요 ㅎㅎ 그전에 쓸땐 잘됐어서요 ㅎㅎ 해봐야겠네요 ㅎㅎ

전문적인 내용 같아서 잘은 모르지만 그래도 보고 갑니다 ^^

Nodejs를 이용해서 패턴을 이용한 무언가를 만들어 보고 싶은 욕구가 생기네요 잘 읽었습니다.

우왕~~ 제가 방금 본것은 글자의 유성우 인가요~ 아름다운데 헤롱헤롱합니다.. 으갸갸갸. 늘 코인에 대해 공부하다 기술적인 부분에서 확신이 안들 때마다 코딩과 프로그래밍에 대한 공부 의욕이 불끈했다가,시간의 부족함으로 이내 내려놓는데...@nhj12311님과 많은 분들 글을 보니 새삼 놀랍습니다. .. 잘보았습니다! ^^

fibers 설치 오류가 뜹니다. 이유가 무엇일까요? pyhton.exe는 아래 위치에 있습니다. 그리고 cmd창에서 python 쳐도 뜨고요. 혹시 fiber가 python 2.7에서만 동작하나요? 설치된 파이썬은 3.5입니다.

네 맞습니다. 2.7을 설치해주셔야 합니다. 본문에 넣을게요 . 제가 빼먹엇어요. ㅠㅠ

2.7 설치했는데 역시 오류가 나네요. node.h가 없다고 나옵니다. 어떻게 하는지 혹시 아시나요?

스팀챗으로 연락 해주시면 좋을듯 합니다 :)

스팀챗에서 대기 중입니다.

같은 계정으로 대화를걸겠습니다~

음? 결론이 어떻게 나셨을까요? ㅎㅎ 이제 python 설치해야하는데...

일단 오늘은 여기서 멈춰야겠군요 ㅠㅠ

C:\Users\User\nhj12311\test_1\node_modules\fibers>if not defined npm_config_node_gyp (node "D:\추성일\node.js\node_modules\npm\node_modules\npm-lifecycle\node-gyp-bin\....\node_modules\node-gyp\bin\node-gyp.js" rebuild --release ) else (node "D:\추성일\node.js\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js" rebuild --release )
이 솔루션의 프로젝트를 한 번에 하나씩 빌드합니다. 병렬 빌드를 사용하려면 "/m" 스위치를 추가하십시오.
MSBUILD : error MSB3428: Visual C++ 구성 요소 "VCBuild.exe"을(를) 로드할 수 없습니다. 이 문제를 해결하려면 1) .NET Framework 2.0 SDK를 설치하거나, 2
) Microsoft Visual Studio 2005를 설치하거나, 3) 해당 구성 요소가 다른 위치에 설치되어 있는 경우에는 그 위치를 시스템 경 로에 추가하십시오. [C:\Users\User\nhj12311
test_1\node_modules\fibers\build\binding.sln]

혹시 계정이름이 영어가 아니지 않나요? 컴퓨터 사용자 계정이름 문제라는 말이 있어서 변경을 해주고 나니 이 에러가 해결되었습니다

전 계정이름 변경하였더니 다른 프로그램들이 불안해져서 전체적으로 시스템이 불안해졌어요. 일단 한글로 변경한 상태입니다.

레지스터리편집기에서도 바꿔주셨나요? 저는 이거 하고 나니 되더군요...

아 그런가요. 확인해 보겠습니다. 감사합니다. 사용자이름이 링크에 나오는 모든 registery를 바꾸어야 하나요?

콜백 지옥은 너무 끔찍하죠 ㅠㅠ
잘 읽었습니다