[개발] nodejs + steem-js 콜백 지옥을 탈출해보자. - synchronize.js 편
오랜만에 개발 포스팅입니다. 개발 포스팅 해야지, 해야지 하면서 잘 못했는데 좀 더 분발해야겠습니다.
실제로 개발에 들어가기 전에 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 + H
→ Add 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를 활용할 준비가 된것 같습니다. 다음엔 개발 프로젝트에 필수적으로 세팅해야할 로깅 처리를 해보도록 하겠습니다.
Cheer Up!
이걸 하기 전에 파이썬 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]
선생님 시간되실때 잠시 원격으로보고 싶네요. 어제 제 피씨에서는 넘나 쉽게 되었네요. ㅜㅜ 그냥 싱크폴더 밑에서 fibers만 설치해주고 완결되었습니다.
혹시 계정이름이 영어가 아니지 않나요? 컴퓨터 사용자 계정이름 문제라는 말이 있어서 변경을 해주고 나니 이 에러가 해결되었습니다
전 계정이름 변경하였더니 다른 프로그램들이 불안해져서 전체적으로 시스템이 불안해졌어요. 일단 한글로 변경한 상태입니다.
레지스터리편집기에서도 바꿔주셨나요? 저는 이거 하고 나니 되더군요...
아 그런가요. 확인해 보겠습니다. 감사합니다. 사용자이름이 링크에 나오는 모든 registery를 바꾸어야 하나요?
https://www.tabmode.com/windows10/win10-user-name-change.html
아까 참고한거는 못찾겠고 가장 유사합니다
콜백 지옥은 너무 끔찍하죠 ㅠㅠ
잘 읽었습니다