Hapi.jsとSocket.IOの練習として、前回はSocket.IOサーバー側でsetIntervalの5秒間隔でダミーのメッセージをemitするサンプルを作りました。今回はもう少し実践的にTwitter Streaming APIのPOST statuses/filterから指定したキーワードをリアルタイム検索してブラウザへ表示するサンプルにしてみます。
プロジェクト
適当なディレクトリにプロジェクトを作成します。リポジトリはこちらです。
$ ~/node_apps/docker-hapi-twitter |
app.js
app.jsがエントリポイントです。通常のHTTPサーバーとSocket.IOサーバーの2つをラベルを付けて起動しています。Socket.IOサーバーの方はプラグインとしてtwitter.js
ファイルに実装しました。
'user strict'; |
twitter.js
Twitter APIの認証情報やSocket.IOのポート番号などはdotenvが管理する.env
ファイルに定義します。.env.default
をリネームして使います。
PUBLIC_IP= |
twitter.jsにhapiのプラグインとしてTwitter Streaming APIのPOST statuses/filterを実装していきます。Node.jsのTwitter用パッケージはいくつかありますが、twitがきにいっています。
var Twit = require('twit'), |
簡単な仕様
Node.jsとSocket.IO、Twitter Streaming APIの使い方は以下を参考にしてなるべく効率的なリスナーの使い方にしています。
- Node.js, Socket.io and the Twitter Streaming API in Heroku
- Using the Twitter Stream API to Visualize Tweets on Google Maps
簡単な仕様を作りました。
- ブラウザからSocket.IOの接続が来てからTwitterのストリームを開始する
- 接続しているSocket.IOのクライアントがなくなったらTwitterのストリームは閉じる
次回はクライアントをReagentで
キーワードは固定でbabymetal
にしています。Socket.IOサーバーができたので、次回はキーワードを画面から入力できるようなフォームをReactとReagentで作成する予定です。最終的にはClojureとClojureScriptのフルスタックにしたいです。
index.html
index.htmlはHandlebarsをテンプレートに使いました。Socket.IOの1.0からsocket.io.js
のクライアントはcdnjsで配布されるようになりました。今回はhapiがサーバーを複数起動できることの確認のためSocket.IOサーバーのポートをHandlebarsに{{socketio_host}}
を渡してURLを作成します。
<!DOCTYPE html> |
ブラウザで確認
Docker Composeでサーバーを起動します。
$ cd ~/node_apps/docker-hapi-twitter |
ブラウザでhapiのHTTPサーバーのURLを開くとSocket.IOクライアントがサーバーと接続を始めます。
ストリームで取得したtweetは少しだけ整形して#tweets
のdivにprependします。tweetのテキスト本文と、ユーザープロファイルのイメージ、tweetのURL、ユーザー名など表示します。
var tweetEl = |