Hatena::ブログ(Diary)

EBLOG Branch RSSフィード Twitter

2011-12-06

独自イベントを発火するオブジェクトを作る

既存のモジュールから手軽にイベントを設定する方法のメモ。

まだまだ知らないこと多いなぁ・・。

組み込みモジュールを読み込む

var events = require('events'),
    util = require('util');

EventEmitterをprototype継承する

function MyEventSouce() {}

//utilクラスを使って継承
util.inherits(MyEventSouce, events.EventEmitter);

var myEvent = new MyEventSouce();

//独自イベントを監視
myEvent.on('myEvent', function (data) {
    console.log('Fire!: ', data);
});

setTimeout(function () {

    //独自イベントを発火
    myEvent.emit('myEvent', 'hoge');
}, 1000);

2011-11-10

Node.jsのエラーでサーバが停止しないようにする

ないはずないと思いながらも、なかなか見つからなかったエラー処理のお話。

以下のようにエラー(uncaughtException)をListenしておけばいいみたい。

uncaughtException を監視する

Node.jsマニュアルの和訳で見つけました。↓

http://nodejs.jp/nodejs.org_ja/api/process.html#event_uncaughtException_

説明を引用すると、

発生した例外がイベントループまでたどり着いた場合に生成されます。 もしこの例外に対するリスナーが加えられていれば、 デフォルトの動作 (それはスタックトレースをプリントして終了します) は起こりません。

なにもしていないとエラー内容をコンソールに出力してサーバが停止しますが、

このuncaughtExceptionをListenしておけばそこでエラーを拾える、ということのよう。

try .. catchで適切に処理するのが望ましいけど、思わぬエラーでサーバが停止しないように入れておくといいみたい。

ちなみにここに飛んだ場合はなにもしないと接続中のままになってページが表示されないけど、

サーバ自体が落ちるわけではないから他の人がアクセスした場合は正常にページが表示される。

Syntax

process.on('uncaughtException', function (err) {
  console.log('Caught exception: ' + err);
});

2011-11-01

Node.jsで動いているサービスにドメインを割り当てる

方法については以下の記事を参考にしました。

Node.jsで簡単なHTTPサーバを作ってみた

Apacheでリバースプロキシする

バーチャルホストの設定を以下のようにして設定することで、apacheからプロキシする?という感じのようです。

※設定ファイルは使用しているサーバによって多少異なると思いますが、大体、「/etc/httpd.conf」と「/etc/extra/httpd-vhosts.conf」あたりになると思います。

NameVirtualHost *:80
 
<VirtualHost *:80>
        ServerName example.com
        ProxyPass / http://localhost:8124/
        ProxyPassReverse / http://localhost:8124/
</VirtualHost>

これで http://example.com/アクセスがあると、8124番ポートで動いているNodeのサービスが表示されるようになります。

実際の設定についてはサブドメインでの運用になるかと思います。

サブドメインの設定については使用しているドメイン管理サービスなどで設定後、自身のサーバに上記で設定したサブドメインアクセスがあった場合に、表示させたいport番号で動いているNodeのサービスが表示されるよう設定してやります。

これで無事、Nodeをサブドメインで運用できるようになりました。

2011-10-18

Node.jsでcookieを保存する

色々探してやっと見つけた。

というか、writeHeadに配列渡せたのか・・。

ということでメモ。

res.writeHead(200, [
    ['Set-Cookie', 'mycookie1=value1'],
    ['Set-Cookie', 'mycookie2=value2'],
    ['Content-Type', 'text/html']
]);

みたいにしてやるとcookieを保存しつつHTMLを表示。

こちらの記事を参考にしました↓

http://caolanmcmahon.com/posts/multiple_set_cookie_headers_in_node_js


expressを使う場合

ちなみにexpressを使ってる場合は以下みたいに書けるよう。

Syntax

res.cookie(name, val[, options])

example

res.cookie('rememberme', 'yes', { expires: new Date(Date.now() + 900000), httpOnly: true });

2011-10-17

開発環境と本番環境でcallbackなどのURLを変える

Node.jsで開発をしていて、ローカルにNode.js環境を作成していると開発中は「localhost」などでアクセスして確認したりすると思います。

それをそのままサーバにアップして実行しようとするとURLの部分でlocalhostが残ったままになってしまったりします。

しかし毎回そこを書き換えるのもめんどくさいので、自分は以下のようにして処理を分けています。

var domain = (process.argv[2] === 'prod') ? 'exsample.com' : 'localhost';

そして本番で実行するときは

$ node app.js prod

のように実行します。

コマンドラインの第一引数が「process.argv[2]」に入り、それ以降の引数はargv[3], argv[4]...のようになっていくみたいです。

////////////////////////////////////////////////////

[追記]

光の速さでコメントもらったので追記しておきますw

標準的なやり方としては以下のようにやるようです。

$ NODE_ENV=production node app.js

一行で書きます。

で、app.js内では

var domain = (process.env.NODE_ENV === 'production') ? 'exsample.com' : 'localhost';

などのようにしてアクセスできるみたいです。

(ちなみに普通に $ node app.js で実行した場合は、NODE_ENVは undefined になる)