Node.js

例年のことだが12月から3月にかけては非常に忙しく(年度末のせい)、Raspberry Piに電源を入れている暇もなかったのだが、GW前にはどうにか落ち着いてきたのでblogを再開。

今まではほとんどPythonを使ってRaspberry Piに接続したセンサからデータを取得したりしていたが、最近は制御系のシステムでもブラウザをUIに使えないか?という話が仕事の案件として割と多く、その関係でJavaScriptをRaspberry Piで試したりしている。

サーバーサイドはPHPでクライアントがJavaScriptというパターンが一般的には多いようだが、異なる言語でシステムを組むのはどうも抵抗があったので、サーバーサイドもJavaScriptで作成できる「Node.js」をRaspberry Piに導入して動かしてみたところ、非常に簡単にWebアプリを構築する事ができた。

Node.jsはapt-getでインストールすると古いバージョンが入ってしまうので、raspbianでは以下のようにDebパッケージからインストールする。

$ wget http://node-arm.herokuapp.com/node_latest_armhf.deb 
$ sudo dpkg -i node_latest_armhf.deb

インストール後にバージョンを確認するとv0.12.1だった

$ node -v
v0.12.1

この状態でもサーバーサイドJavaScriptを動作させる事は可能だが、Webアプリのひな形を自動生成してくれるフレームワーク「express」が非常に便利なので、これもインストールしておく。インストールにはNode.jsに含まれるパッケージ管理ツール「npm」を使用。

$ sudo npm install -g express-generator

npmでパッケージをインストールする時に「-g」オプションを付けると、すべてのプロジェクトで共通のモジュールとしてインストールされる。付けないとプロジェクト毎のフォルダにインストールされるので、同じモジュールでもプロジェクト毎にバージョンが異なるものを使うといった事ができるようだ。

expressでWebアプリのひな形を作成し、起動するには以下のように行う

$ express -e MyWebApp
$ cd MyWebApp
$ npm install
$ npm start

「express -e MyWebApp」でMyWebAppプロジェクトのフォルダが作成され、その中にひな形となるファイル一式が自動生成される。オプションの「-e」はHTMLテンプレートエンジンにEJSを使用するという指定で、何も付けないデフォルトではJADEを使用したひな型になるのだが、JADEは簡潔に書ける代わりに表記法を覚える必要があるので、最初はEJSで始める事をお勧めする。

「npm install」を実行すると生成されたpackage.jsonに記載されたパッケージがインストールされる。
「npm start」はpackage.jsonの「scripts:start」に記載された内容を実行するので、実際には「node ./bin/www」が実行される事になる。
「./bin/www」はサーバオブジェクトを生成して待ち受け状態に入り、ブラウザからアクセスされると「app.js」の内容に従って其々の処理を行うという動きをする。Node.jsのサーバはデフォルトではポート3000を使用するので、ブラウザでRaspberry Piのポート3000にアクセスすれば良い。IPが「192.168.1.12」だとしたら「192.168.1.12:3000」にアクセスする。

Raspberry Piのコンソールに

> node ./bin/www

GET / 200 574.327 ms - 207
GET /stylesheets/style.css 200 222.119 ms - 110
GET /favicon.ico 404 203.292 ms - 1998

のように表示されて、ブラウザに
express
と応答が表示されていればOK。Raspberry Piではサーバの起動に少し時間がかかるので、すぐにアクセスするとエラーになる場合がある。

expressはルートの下に「/users」というページを自動生成しているので、アプリが起動した状態で「192.168.1.12:3000/users」へアクセスすると

respond with a resource

と一行だけ表示されるはず。これは「./routes/users.js」ファイルの

router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});

によって表示されているもので、app.jsファイルの

var users = require('./routes/users');
app.use('/users', users);

という二行の定義から呼び出されている。つまり同じようにクラスを作ってapp.jsファイルに追加すれば、Webアプリのページを増やすことができる。

Raspberry PiでWebアプリを動かす場合は、何かデバイスを制御したりセンサの値を取得したりといったコードをこのひな型に追加していく事になるのだが、長くなるのでそれは次回。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中