Node.js

サーバサイドNodeの使い道2

サーバサイドのアプリケーションエンジニアとして Nodeの使い道を知るためにNodeのアプリケーションをDDDで作ってみました。 https://github.com/pospome/NodeRealTimeApp初めてのNode&DDDなので完成度は低く、 自分が未熟なせいで初期の設計方針がDDDとは異…

サーバサイドNodeの使い道

Nodeといえば、 socket.ioによるリアルタイム通信が有名ですが、 「それ以外にどう使えるのか?」 「他の言語じゃダメなの?」 という点について個人的な見解をまとめてみました。 サーバサイドNodeの使い道 from pospome

node + express4 の router が実行される前に処理をハンドリングする

expressで認証周りを実装していて、 ログイン状態を判断するロジックを全てのrouterに実行させたい。 他のフレームワークだと、before() とか親クラスを用意して、 controllerが実行される前にチェックできるんだけど、 expressではどうするのか?答えは簡単…

bluebird の using の使い方

bluebirdにはusingというAPIがある。 https://github.com/petkaantonov/bluebird/blob/master/API.md#promiseusingpromisedisposer-promise-promisedisposer-promise--function-handler---promiseこれはファイルオープン、DB接続の管理などのリソース管理に…

node + bluebird + typescript で spread, finally を利用したら undefined is not a function

タイトルの通り、bluebird の spread, finally を利用すると、 undefined is not a function が発生してしまった。しかも、特定のケースのみ発生する。原因はTypeScriptの import のミスだった。今回の実装では以下のように bluebird を読み込んでるけど・・…

Express4 + Promise + エラーハンドリング

Promiseのcatchで例外を投げてもExpressがハンドリングしてくれなかった。 以下がreject側のコード。 TypeScriptです。 public static signup(userName: string, userPassword: string): Promise<User> { return new Promise<User>( (resolve, reject) => { const db1Mas</user></user>…

Node の pm2 で cluster_mode を利用した場合に reload / restart すると処理が止まる

結論から言うと、 nodeのバージョンが古かった。 v0.11 以上じゃないとプロセスが溜まってしまうらしい。 https://github.com/Unitech/pm2/issues/350

Express4 + TypeScript

以下を利用すれば可能だけど、いつまで保守されるか分からないので修正する手順を残しておく。 最終的な修正結果は以下と同じになります。 https://github.com/czechboy0/Express-4x-Typescript-Sample npm install をする前に jsファイルをtsファイルに変換…

express 4 + node + typescript で typings/node/node.d.ts(255,26): error TS2304: Cannot find name 'DataView'. のエラー

以下のエラーが出た。typings/node/node.d.ts(255,26): error TS2304: Cannot find name 'DataView'. typings/node/node.d.ts(269,21): error TS2304: Cannot find name 'Map'. typings/node/node.d.ts(278,21): error TS2304: Cannot find name 'Set'. typi…

Node.js + Passport + MySQL でセッション認証

https://github.com/pospome/NodePassportSample ↑ サンプルプログラムです。 これを見ながら読み進めると分かりやすいかもしれません。passportは認証対応しているサービスが沢山あり、 それらがモジュール化されているので、 必要な認証に対応するモジュー…

【Node.js】socket.io-php-emitterの使い方

まずはPHP側のライブラリをインストールする。 https://github.com/rase-/socket.io-php-emitterredis自体とphpのredisライブラリが必要になる。redisライブラリは php-redis or TinyRedisClient を利用する。 TinyRedisClientはsocket.io-php-emitterに付属…

【Node.js】socket.io + cluster で 400 (Bad Request) + Connection closed before receiving a handshake response

socket.io + cluster を使っていたら、クライアント側(HTML + JS)で以下のエラーが発生した。WebSocket connection to 'ws://192.168.33.10:3000/socket.io/?EIO=3&transport=websocket&sid=nP02s_VbJ4I968puAAAO' failed: Connection closed before recei…

socket.io-redis, socket.io-emitter, sticky-session の違いとは?

socket.io を使っていると以下が問題になることがある。 これらを解決するのが socket.io-redis, socket.io-emitter, sticky-session というわけ。 【問題1】 clusterで複数プロセスを起動していると複数プロセス間で通信ができなくなる。 ユーザー1が接続を…

【Node.js】socket.io-emitter(サーバからのPUSH) の使い方

socket.ioの通信はクライアントがトリガーになっているが、 サーバ側から任意のタイミング、特定のユーザーへメッセージを送信したいことがある。 (iOS,AndroidでいうPUSH通知のようなもの)それを実現するのがsocket.io-emitterというモジュール。 https:/…

【Node.js】socket.io(ver 1.3.5) の NameSpace & Room の使い方

socket.io には NameSpace と Room という機能がある。NameSpace … 機能単位で分ける Room ... NameSpace内のカテゴリーという位置づけ。チャットシステムを作る時に機能が 「全社チャット」「部署チャット」「フリートーク」の3つだった場合は 「全社チャッ…

【Node.js】express の jadeテンプレート でscript, styleタグを直書きする。

以下はstyleタグを直書きしたケース。 style(). の下にインデントしてcssを書けばOK。 scriptタグだと script(). とかになる。 <html> <head> <title>Socket.IO chat</title> style(). * { margin: 0; padding: 0; box-sizing: border-box; } body { font: 13px Helvetica, Arial; } fo</head></html>…

【Node.js】express4 で cluster

express4 で cluster を使ってみる。まずは cluster.js というファイルを作る。 作る場所はとりあえず app.js と同じ階層にでもしておくといい。 これはあとで変更できる。ファイル内容は以下になる。 clusterの構文そのままで、 elseの部分にnodeのエントリ…

【Node.js】MySQLのトランザクション対応

NodeJSはシングルプロセスなので、 プールした接続だとトランザクションを管理できない。 トランザクションを開始する場合は新規の接続を生成する必要がある。 トランザクションを利用しない単発のINSERTであれば、プールした接続を使いまわしても大丈夫。 …

【Node.js】redis を使って warning: possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit.

redisを使っていると以下のエラーが出た。warning: possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit.これはredisというよりもnodeのエラー。 イベントを検知するリスナーを11個セ…

【Node.js】MySQLへの接続

MySQL 以下を利用するのでインストールする。 https://github.com/felixge/node-mysql/#pooling-connections# npm install --save mysql --saveでpackage.jsonに追記するようにする。 【接続】 nodeJSはPHPとは違って起動時に接続を確保しておく。 接続には …