noteのタイトル画像

ビットコイン自動トレードへの道 No.9 (OHLCVデータ配信用のexpressサーバを立てる)

前回でOHLCVデータをsqliteデータベースに収集することができた。
今回はこのデータを他のアプリケーションから利用できるようにREST APIで配信する準備を進める。

RESTはWebApi界隈では昨今人気のWeb通信のアーキテクチャだ。
昔はSOAPなどでXMLベースのデータをやり取りしていたが、いまではRESTでJSONオブジェクトをやり取りするのが主流だ。前回紹介したSqliteからデータを抜き出してresponse.json()で戻し、JSONオブジェクトとしてデータをやり取りすることを目標とする。

Node.jsで簡単にRESTAPIを作成するにはExpressと呼ばれるWebアプリケーションMVCフレームワークを用いるのが有効だ。興味のある方はここを参照してみて欲しい。

expressのインストールはこれまで同様 NPMを使って行う

npm install --save express

上記のコマンドを実行すると、expressが導入され、package.jsonの中身はおおまかに言って以下のようになっているはずだ

{
 "name": "hoge",
 "version": "1.0.0",
 "description": "",
 "main": "server.js",
 "scripts": {
   "start": "node -r babel-register src/server.js"
 },
 "author": "",
 "license": "ISC",
 "devDependencies": {
   "babel-cli": "^6.26.0",
   "babel-plugin-transform-runtime": "^6.23.0",
   "babel-preset-env": "^1.6.1",
   "babel-register": "^6.26.0"
 },
 "dependencies": {
   "express": "^4.16.3"
 }
}

2018-04-18時点ではexpressのバージョンは4.16.3のようだ。(上記は事前にBabel等のインストールは済ませてあるものとする)

次にsrcフォルダ下に「server.js」というファイルを作り、以下のように記述してみよう。

// src/server.js
import express from 'express';

const app = express();

const data = [
   { key: 1, name: "hoge" },
   { key: 2, name: "foo" },
   { key: 3, name: "bar" }
];

app.get('/', (req, res) => {
   res.json(data);
});

app.listen(8080);
console.log('start express');

このファイルを保存したら、コマンドラインから
「npm start」を実行し、expressサーバを起動してみる。(今回、このサーバはポート8080を使用するので、他のサーバが8080を使用していた場合は、別のポート番号に変更して欲しい)

start express

と表示されたら、expressサーバが起動している。ブラウザから
「http://localhost:8080」
のURLを開いてみると、以下のようにデータが戻されていると思う。

[{"key":1,"name":"hoge"},{"key":2,"name":"foo"},{"key":3,"name":"bar"}]

プログラム中に記述した「data」がJSON形式でブラウザ上に表示されている。
このようにexpressを使うと非常に簡単にREST/JSONのAPIが完成する。
(もっとお手軽なrestifyというモジュールもあるが、今回はオーソドックスなexpressを使用した)
Clusterなどのモジュールを使えばCPUのコア数分だけサーバの処理能力をスケールアウトし、高負荷にも耐えられる構成にすることが出来る。(もっとも自宅でそこまで高負荷な状況はあまり無いとは思うが)

実際に筆者の環境では、BitMEXサイトから1年半分ほどの1分幅データをsqliteデータベースに保管し、そのデータをexpressで配信し、D3jsで受け取り、ローソク足チャートを描画してみた。

上記は、1時間分のデータを描画したところだ。

今回、expressというMVCフレームワークによるRESTAPIサーバの立て方を簡単に説明した。複数のアプリケーションが強調してやり取りするのにきっと役に立つと思う。

次回はもう少し実用的なexpressサーバの立て方と、cors問題への対処、描画ライブラリであるD3jsの使い方(と、ハマったところ)を解説していきたいと思う。


ソフトウェア・エンジニアを40年以上やってます。 「Botを作りたいけど敷居が高い」と思われている方にも「わかる」「できる」を感じてもらえるように頑張ります。 よろしくお願い致します。