ビットコイン自動トレードへの道 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を作りたいけど敷居が高い」と思われている方にも「わかる」「できる」を感じてもらえるように頑張ります。 よろしくお願い致します。