actionhero.js입문 - Part1: Getting Started

actionhero.js입문 - Part1: Getting Started

2022-10-05 last update

13 minutes reading Node.js websocket actionhero.js Redis api
actionhero.js는 Node.js의 API 프레임 워크입니다. TCP 소켓, WebSocket, Ajax의 멀티 트랜스포트에 대응하고 있는 것이 특징입니다. 튜토리얼이나 라이브 코딩 동영상 등도 충실하고 있으므로 공부의 도움이 될 것 같습니다.

특징



다중 전송



actionhero의 이름에서 알 수 있듯이 하나의 엔드 포인트에서 여러 전송 프로토콜에 해당하는 API 작업을 만들 수 있습니다. 최근 클라이언트 앱은 특히 SPA가 되면 REST API/Ajax와 WebSocket/Socket.IO를 모두 사용하는 경우가 많습니다.

작업 비동기 처리



API 서버로서의 기능 외에도 Redis를 사용한 클러스터 기능과 풍부한 미들웨어가 제공됩니다. 특히 사용하고 싶은 미들웨어는 node-resque를 사용한 태스크의 비동기 처리입니다.

Sails.js 도 미들웨어로 기능을 확장할 수 있는 것 같습니다만, actionhero.js 의 경우는 디폴트로 필요한 기능이 짜넣어지고 있으므로 편리합니다.

Alternatives



API 프레임워크로서는 이하가 alternatives가 됩니다.
  • Express
  • restify
  • Hapi.js
  • 코아
  • 루프백
  • Sails.js

  • Getting Started



    즉시 Getting Started를 실행하는 환경을 준비합니다.

    프로젝트



    적절한 디렉토리에 프로젝트를 만듭니다.
    $ cd ~/node_apps/docker_actionhero
    $ tree
    .
    ├── Dockerfile
    ├── docker-compose.yml
    └── node_modules -> /dist/node_modules
    

    컨테이너 내에서 /app/node_modules/dist/node_modules의 심 링크가므로 현재 디렉토리를 컨테이너의 /app 디렉토리에 매핑 할 때 마찬가지로 심 링크가 작동하도록합니다.
    $ ln -s /dist/node_modules .
    

    Dockerfile은 작업 사용자를 만듭니다. 이번에는 package.json을 사용하지 않고 npm 명령으로 actionhero를 설치합니다. 나중에 actionhero 명령으로 코드를 생성하지만 현재 디렉토리에 package.json을 생성하기 위해 비워 둡니다.

    ~/node_apps/docker-actionhero/Dockerfile
    FROM node:0.12
    MAINTAINER Masato Shimizu <[email protected]>
    
    WORKDIR /app
    
    RUN adduser --disabled-password --gecos '' --uid 1000 docker && \
        mkdir -p /dist/node_modules && \
        ln -s /dist/node_modules /app/node_modules && \
        chown -R docker:docker /app /dist/node_modules
    
    USER docker
    RUN npm install actionhero
    
    COPY . /app
    ENTRYPOINT ["npm", "start"]
    CMD []
    

    Docker Compose에서 Redis도 함께 설치합니다. links 지시어로 연계할 수 있으므로 간단합니다. actionhero.js는 기본값은 8080으로 serve입니다. Docker 호스트의 8080 포트는 이미 사용하고 있기 때문에 여기에서는 8089에 매핑합니다.

    ~/node_apps/docker-actionhero/docker-compose.yml
    server:  &defaults
      image: masato/actionhero
      volumes:
        - .:/app
        - /etc/localtime:/etc/localtime:ro
      ports:
        - 8089:8080
      links:
        - redis
    actionhero:
      <<: *defaults
      entrypoint: ["./node_modules/.bin/actionhero"]
    npm:
      <<: *defaults
      entrypoint: ["npm"]
    bash:
      <<: *defaults
      entrypoint: ["bash"]
    redis:
      image: redis
      restart: always
      volumes:
        - ./redis:/data
    

    Docker 이미지를 빌드합니다.
    $ docker build -t masato/actionhero .
    

    Dockerfile의 npm install에서 actionhero 명령이 ./node_modules/.bin/actionhero에 설치되었습니다. generate 명령에서 앱 템플릿을 만듭니다.
    $ docker-compose run --rm actionhero generate
    info: actionhero >> generate
    info: Generating a new actionhero project...
    info:  - creating directory '/app/actions'
    info:  - creating directory '/app/pids'
    info:  - creating directory '/app/config'
    info:  - creating directory '/app/config/servers'
    info:  - creating directory '/app/config/plugins'
    info:  - creating directory '/app/initializers'
    info:  - creating directory '/app/log'
    info:  - creating directory '/app/servers'
    info:  - creating directory '/app/public'
    info:  - creating directory '/app/public/javascript'
    info:  - creating directory '/app/public/css'
    info:  - creating directory '/app/public/logo'
    info:  - creating directory '/app/tasks'
    info:  - creating directory '/app/test'
    info:  - wrote file '/app/config/api.js'
    info:  - wrote file '/app/config/plugins.js'
    info:  - wrote file '/app/config/logger.js'
    info:  - wrote file '/app/config/redis.js'
    info:  - wrote file '/app/config/stats.js'
    info:  - wrote file '/app/config/tasks.js'
    info:  - wrote file '/app/config/errors.js'
    info:  - wrote file '/app/config/routes.js'
    info:  - wrote file '/app/config/servers/socket.js'
    info:  - wrote file '/app/config/servers/web.js'
    info:  - wrote file '/app/config/servers/websocket.js'
    info:  - wrote file '/app/package.json'
    info:  - wrote file '/app/actions/status.js'
    info:  - wrote file '/app/actions/showDocumentation.js'
    info:  - wrote file '/app/public/index.html'
    info:  - wrote file '/app/public/chat.html'
    info:  - wrote file '/app/public/css/actionhero.css'
    info:  - wrote file '/app/public/logo/actionhero.png'
    info:  - wrote file '/app/public/logo/sky.jpg'
    info:  - file '/app/README.md' already exists, skipping
    info:  - wrote file '/app/gruntfile.js'
    info:  - wrote file '/app/test/example.js'
    info:
    info: Generation Complete.  Your project directory should look like this:
    |- config
    | -- api.js
    | -- logger.js
    | -- redis.js
    | -- stats.js
    | -- tasks.js
    | -- servers
    | ---- web.js
    | ---- websocket.js
    | ---- socket.js
    |-- (project settings)
    |
    |- actions
    |-- (your actions)
    |
    |- initializers
    |-- (any additional initializers you want)
    |
    |- log
    |-- (default location for logs)
    |
    |- node_modules
    |-- (your modules, actionhero should be npm installed in here)
    |
    |- pids
    |-- (pidfiles for your running servers)
    |
    |- public
    |-- (your static assets to be served by /file)
    |
    |- servers
    |-- (custom servers you may make)
    |
    |- tasks
    |-- (your tasks)
    |
    |- tests
    |-- (tests for your API)
    |
    readme.md
    gruntfile.js
    package.json
    info:
    info: you may need to run `npm install` to install some dependancies
    info: run 'npm start' to start your server
    

    package.json에 추가된 패키지를 npm install로 설치합니다.
    $ docker-compose run --rm npm install
    

    서버 시작



    Docker Compose의 server 서비스에 정의 된 entrypoint npm start에서 package.json actionhero start를 실행합니다.
    $ docker-compose run --rm server
    
    > [email protected] start /app
    > actionhero start
    
    info: actionhero >> start
     * Error fetching this hosts external IP address; setting id base to 'actionhero'
    2015-06-21 08:38:12 - notice: *** starting actionhero ***
    2015-06-21 08:38:12 - warning: running with fakeredis
    2015-06-21 08:38:12 - notice: pid: 13
    2015-06-21 08:38:12 - notice: server ID: actionhero
    2015-06-21 08:38:12 - info: ensuring the existence of the chatRoom: defaultRoom
    2015-06-21 08:38:12 - info: ensuring the existence of the chatRoom: anotherRoom
    2015-06-21 08:38:12 - notice: starting server: web
    2015-06-21 08:38:12 - notice: starting server: websocket
    2015-06-21 08:38:14 - notice: environment: development
    2015-06-21 08:38:14 - notice: *** Server Started @ 2015-06-21 08:38:14 ***
    2015-06-21 08:38:14 - info: actionhero member actionhero has joined the clust
    

    서버가 시작되었지만 오류가 발생했습니다. issues 에서처럼 Error 이 무시할 수 있습니다. id.js 파일에서 클러스터의 app.id IP 주소를 검색 사양으로 실패합니다. 궁금하다면 환경 변수 ACTIONHERO_TITLE를 지정하는 것이 좋습니다.

    브라우저에서 Docker 호스트의 IP 주소를 지정합니다. 꽤 멋진 톱 페이지입니다.