___  ___    _ _    _  _ _____   _____
 / __|/ _ \  | | |  | || |_ _\ \ / / __|
| (_ | (_) | |_  _| | __ || | \ V /| _|
 \___|\___/    |_|  |_||_|___| \_/ |___|

 --- A GOPHER-LIKE INTERFACE FOR HIVE BLOCKCHAIN ---

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

BY: @nhj12311 | CREATED: Jan. 28, 2018, 9:10 a.m. | VOTES: 37 | PAYOUT: $24.06 | [ VOTE ]

[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 + 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 저장소 + 리눅스 운영

TAGS: [ #kr-dev ] [ #kr ] [ #busy ] [ #steemdev ] [ #kr-dev-nodejs ]

Replies

@happyberrysboy | Jan. 28, 2018, 9:26 a.m. | Votes: 0 | [ VOTE ]

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

@nhj12311 | Jan. 28, 2018, 9:29 a.m. | Votes: 0 | [ VOTE ]

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

@happyberrysboy | Jan. 28, 2018, 2:01 p.m. | Votes: 0 | [ VOTE ]

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

@kaine | Jan. 28, 2018, 10:22 a.m. | Votes: 0 | [ VOTE ]

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

@dennis76 | Jan. 28, 2018, 11:57 a.m. | Votes: 0 | [ VOTE ]

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

@valueup | Jan. 28, 2018, 2:05 p.m. | Votes: 0 | [ VOTE ]

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

@tradingideas | Feb. 2, 2018, 4:08 p.m. | Votes: 0 | [ VOTE ]

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

@nhj12311 | Feb. 2, 2018, 5:30 p.m. | Votes: 0 | [ VOTE ]

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

@tradingideas | Feb. 3, 2018, 2:26 a.m. | Votes: 0 | [ VOTE ]

2.7 설치했는데 역시 오류가 나네요. node.h가 없다고 나옵니다. 어떻게 하는지 혹시 아시나요?
[IMAGE: https://steemitimages.com/DQmUgxKJkZmnsoJmknLRGPffJtxuHCGAqqk4ctgZ6jbZWiw/image.png]

@nhj12311 | Feb. 3, 2018, 3:36 a.m. | Votes: 0 | [ VOTE ]

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

@tradingideas | Feb. 3, 2018, 10:05 a.m. | Votes: 0 | [ VOTE ]

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

@nhj12311 | Feb. 3, 2018, 10:08 a.m. | Votes: 0 | [ VOTE ]

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

@forhappywomen | Feb. 14, 2018, 6:16 a.m. | Votes: 0 | [ VOTE ]

음? 결론이 어떻게 나셨을까요? ㅎㅎ 이제 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]

@nhj12311 | Feb. 14, 2018, 7 a.m. | Votes: 1 | [ VOTE ]

선생님 시간되실때 잠시 원격으로보고 싶네요. 어제 제 피씨에서는 넘나 쉽게 되었네요. ㅜㅜ 그냥 싱크폴더 밑에서 fibers만 설치해주고 완결되었습니다.

@forhappywomen | Feb. 14, 2018, 7:03 a.m. | Votes: 0 | [ VOTE ]

어떤 웹사이트에서
> npm install --global --production windows-build-tools (관리자 모드로 실행한 커맨드 창에서 실행하셔야 합니다)
>
시간이 좀 걸립니다.
> node-gyp이 python 2.x를 사용하여 python 2.7을 설치한다음에, node-gyp이 그 2.7을 사용도록 설정해야 합니다.
>
위에서 'npm install --global --production windows-build-tools'을 실행하면, 사용자 홈디렉토리 밑에 .windows-build-tools\python27이 이미 설치되어 있습니다.
>* npm config set python <파이썬설치디렉토리>를 설정하세요.

>프로젝트 디렉토리에서, npm install --save mysql을 실행하시면 됩니다

라고 하여 설치중에 있습니다.

원격으로 보셔도 됩니다 ㅎㅎ

@nhj12311 | Feb. 14, 2018, 7:05 a.m. | Votes: 0 | [ VOTE ]

네 저도 막 그렇게도해보고 저렇게도 해보고 했네요 외출중이라 저녁에 가능살거같아요

@forhappywomen | Feb. 14, 2018, 7:10 a.m. | Votes: 0 | [ VOTE ]

아 넵 !! 괜찮습니다. 제가 스팀방을 벗어나서 ㅎㅎ

혹시 나중에 시간되실때 아래링크로 들어오셔서 연락주시면 접속하겠습니다. 7시 넘어서 가능할 것 같습니다 ㅎㅎ. 너무 감사합니다 ㅠㅠ

https://open.kakao.com/o/s8d2BsH

@hyokhyok | March 16, 2018, 11:50 a.m. | Votes: 0 | [ VOTE ]

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

@tradingideas | March 16, 2018, 1:25 p.m. | Votes: 0 | [ VOTE ]

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

@hyokhyok | March 16, 2018, 1:33 p.m. | Votes: 0 | [ VOTE ]

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

@tradingideas | March 16, 2018, 1:38 p.m. | Votes: 0 | [ VOTE ]

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

@hyokhyok | March 16, 2018, 1:52 p.m. | Votes: 0 | [ VOTE ]

https://www.tabmode.com/windows10/win10-user-name-change.html

아까 참고한거는 못찾겠고 가장 유사합니다

@tradingideas | March 16, 2018, 2:21 p.m. | Votes: 0 | [ VOTE ]

링크 감사합니다. 주말에 확인해 볼께요.

@nhj12311 | Feb. 3, 2018, 3:37 a.m. | Votes: 1 | [ VOTE ]

>npm uninstall node-gyp
npm install node-gyp

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

@cheerup | Feb. 3, 2018, 10:06 a.m. | Votes: 2 | [ VOTE ]

Cheer Up!
- from Clean STEEM activity supporter

@gaethug | Feb. 9, 2018, 5:41 p.m. | Votes: 0 | [ VOTE ]

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

[ BACK TO TRENDING ] [ BACK TO MENU ]
CMD>