[IMAGE: https://steemitimages.com/DQmVbApN2se6QrjgbygpVr3Q6AGkPWH2Cu5sfG458mDdAzL/image.png]
오랜만에 개발 포스팅입니다. 개발 포스팅 해야지, 해야지 하면서 잘 못했는데 좀 더 분발해야겠습니다.
실제로 개발에 들어가기 전에 node.js에 문외한인 경우 무엇부터 해야할까요? 아마 프로젝트의 프레임워크, 디비, 로그설정 등을 먼저 해야할겁니다. 마침 @cheerup 양이 Q&A 활동을 하고 있어서 질문 드려봤습니다. 개발 고수로 보이는 ludorum님께서 친절히 답변을 주셨네요.
답변 전문을 옮길 필요는 없을 것 같구 간추리면 '스팀잇 봇을 개발하는 데는 프라미스 패턴만 사용하면 충분해보인다' 입니다. 내심 nodejs의 콜백 지옥을 벗어나기 위해선 꼭 적용해야겠다는 생각을 하고 있던 터라 알아보았습니다.
콜백지옥은... 뭐냐면...
[IMAGE: https://steemitimages.com/DQmTjqRfzkt5gC1DBFfhp8tbPrZRxqpARvWjNtTafpeUL2r/image.png]
이렇게 steem-js는 콜백 함수로 데이터를 처리하는데 콜백 함수 내에 처리가 계속 되면서 이런 헬게이트 소스가 만들어진다는 겁니다...
[IMAGE: https://steemitimages.com/DQmRwXJpNnwwXUZ68wNxk8iMJ1p643K92rP5a7aujGfjedG/image.png]
으어... 예시로만 코딩을 넣어봤는데 꼭 디아블로를 만난것 같은 느낌입니다.
[IMAGE: https://steemitimages.com/DQmbjq77gtnr6Qt1P5wWCTb6MGoxw319i65PvEic8c1t1bf/image.png]
[IMAGE: https://steemitimages.com/DQmV5VJZzxpubiQD7MZu4k3WKtdHHbwLiJZb1ZxpbhP4PdW/image.png]
요걸 타파하지 않고서는 제대로 코딩을 할수 없겠다는 생각이 듭니다. 내가 원하는건 async 방식의 콜백이 아니라 인터프리터 즉 순차적인 처리였으니까요.
인터넷 검색으로 이것저것 찾아봤는데 이 steem-js를 순차적으로 쓰기위해 @junn님이 예전에 남겨놓으신 글에 synchronize.js를 사용한 후기가 있어 synchronize.js를 해보니 딱 원하는대로 코딩이 진행될 수 있을 것 같습니다. 저 위의 그림이 아래처럼 코딩이 가능해지네요.
[IMAGE: https://steemitimages.com/DQmY9hMaZV5rkLDuxW3WXWnHyz6m37TuDZLKa1CwJUqfUoH/image.png]
비동기식 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를 활용할 준비가 된것 같습니다. 다음엔 개발 프로젝트에 필수적으로 세팅해야할 로깅 처리를 해보도록 하겠습니다.
>지난 회차 살펴보기
>nodejs 개발환경을 구성해보자. 윈도우 개발 + Github 저장소 + 리눅스 운영