Nodeハマったメモ

足の長さが左右で1cm違うくらい体が歪んでいるKameです。

先日社内勉強会にてNode.js + WebSocketについて少し話しました。
内容はほとんどしょぼいデモをしただけだったのですが、それを動かすまでにだいぶ苦労しました。

忘れないためにも色々とメモっておこうと思います。

バージョン

当然色んなサイトを参考にしながらインストールから行なっていったわけですが、
同じ事やってるのにインストールができない、インストールできたけどちゃんと動かないということが多々ありました。
なんでかなと思い参考サイトの日付を見てみると1年くらい前の記事で既にバージョンがだいぶ違ったりします。

僕の場合はなにせsocket.ioがうまく動いてくれませんでした。
色んな事を試しましたが、結局バージョンダウンさせることでようやく動いてくれました。

様々なパッケージを使って動かす場合はさらに複雑化(僕の場合は)するので注意が必要です。

Nodeのバージョン管理をするのに便利なnvmというのもあるらしいのですが、これまたインストールが上手くできずに動かすまでにいたっていません!!

Nodeに限らずバージョンは気をつけないといけないですね。

npmの-gオプション

Nodeのパッケージマネージャnpmですがライブラリをインストールする際に「-g」というオプションがあります。
「-g」オプションをつけると「/usr/local/lib/node_modules」という場所に(環境による)インストールされて別の場所からでもコマンドを呼ぶことができるようになります。
これをグローバルインストールというそうです。
(それに対して「-g」オプションつけない場合はローカルインストール)

最初何も思わずに参考サイトのマネをしてインストールしていってたんですが、これが分かっていなかったのでコマンド通らなかったりで苦労をしました。
これを押さえておくとだいぶ違うと思います。

expressのテンプレートエンジン

Nodeサーバを動かすのに必要な雛形を一瞬で用意してくれるexpressですが、ブラウザ表示用のviewを制御するテンプレートエンジンが色々用意されています。

デフォルトではJadeという形式で用意されるのですが、なにせこいつが使いにくい!

extends layout

block content
  h1= title
  p Welcome to #{title}

こんな感じでタグ付していくんですが、あんまり馴染みのない形だったんでやりにくい!よくわからない!
なので僕はejsという形式にしました。

<html>
	<head>
		<title>huga</title>
	</head>
	<body>
		<%- hoge %>
	</body>
</html>

このほうが馴染みがあって僕には使いやすかったです。

まあ好みかと思うので自分の好きなテンプレートエンジンを使いましょう。他にも色々あります。

別端末から接続する場合のsocketの設定

例えばiPhoneから接続してPCの画面を動かしたいなという場合は以下のように記述する必要があります。


var socket = io.connect('IPアドレス or ドメイン');
	

各サーバのIPアドレスなどを入れましょうということで、当然といえば当然なんですが結構多くのサイトで


var socket = io.connect('http://localhost');
	

と書かれています。
ローカル環境でやる分にはこれでいいのですが別端末から云々となると動かないので注意が必要です。

Nodeのサイトにドメインをのっける

最終これが必要になると思いますが、そのサーバにインストールされているApacheでリバースプロキシなるものをやればドメインを割り当てられます。
僕の場合バーチャルホストしているので以下の様な感じになりました。

※httpd-vhost.confなどで

<VirtualHost *:80>
    ServerName example.com
    ProxyPass / http://localhost:4848/
    ProxyPassReverse / http://localhost:4848/
    DocumentRoot /home/hoge/node/public
</VirtualHost>

4848の部分はNodeが使っているport番号です。expressを利用している場合はデフォルトで3000だったかと思います。

まとめ

Node触ったことがないとあんまり分からないんじゃないか感が出てしまいましたが、
触った際になんでやねんと思った部分をまとめてみました。

実際まだまだつまったところはたくさんあるんですが、忘れたのとまだいまいち理解できていないのでまたいつか書ければと思います。