Node.js
サーバサイドのアプリケーションエンジニアとして Nodeの使い道を知るためにNodeのアプリケーションをDDDで作ってみました。 https://github.com/pospome/NodeRealTimeApp初めてのNode&DDDなので完成度は低く、 自分が未熟なせいで初期の設計方針がDDDとは異…
Nodeといえば、 socket.ioによるリアルタイム通信が有名ですが、 「それ以外にどう使えるのか?」 「他の言語じゃダメなの?」 という点について個人的な見解をまとめてみました。 サーバサイドNodeの使い道 from pospome
expressで認証周りを実装していて、 ログイン状態を判断するロジックを全てのrouterに実行させたい。 他のフレームワークだと、before() とか親クラスを用意して、 controllerが実行される前にチェックできるんだけど、 expressではどうするのか?答えは簡単…
bluebirdにはusingというAPIがある。 https://github.com/petkaantonov/bluebird/blob/master/API.md#promiseusingpromisedisposer-promise-promisedisposer-promise--function-handler---promiseこれはファイルオープン、DB接続の管理などのリソース管理に…
タイトルの通り、bluebird の spread, finally を利用すると、 undefined is not a function が発生してしまった。しかも、特定のケースのみ発生する。原因はTypeScriptの import のミスだった。今回の実装では以下のように bluebird を読み込んでるけど・・…
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のバージョンが古かった。 v0.11 以上じゃないとプロセスが溜まってしまうらしい。 https://github.com/Unitech/pm2/issues/350
以下を利用すれば可能だけど、いつまで保守されるか分からないので修正する手順を残しておく。 最終的な修正結果は以下と同じになります。 https://github.com/czechboy0/Express-4x-Typescript-Sample npm install をする前に jsファイルをtsファイルに変換…
以下のエラーが出た。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…
https://github.com/pospome/NodePassportSample ↑ サンプルプログラムです。 これを見ながら読み進めると分かりやすいかもしれません。passportは認証対応しているサービスが沢山あり、 それらがモジュール化されているので、 必要な認証に対応するモジュー…
まずはPHP側のライブラリをインストールする。 https://github.com/rase-/socket.io-php-emitterredis自体とphpのredisライブラリが必要になる。redisライブラリは php-redis or TinyRedisClient を利用する。 TinyRedisClientはsocket.io-php-emitterに付属…
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 を使っていると以下が問題になることがある。 これらを解決するのが socket.io-redis, socket.io-emitter, sticky-session というわけ。 【問題1】 clusterで複数プロセスを起動していると複数プロセス間で通信ができなくなる。 ユーザー1が接続を…
socket.ioの通信はクライアントがトリガーになっているが、 サーバ側から任意のタイミング、特定のユーザーへメッセージを送信したいことがある。 (iOS,AndroidでいうPUSH通知のようなもの)それを実現するのがsocket.io-emitterというモジュール。 https:/…
socket.io には NameSpace と Room という機能がある。NameSpace … 機能単位で分ける Room ... NameSpace内のカテゴリーという位置づけ。チャットシステムを作る時に機能が 「全社チャット」「部署チャット」「フリートーク」の3つだった場合は 「全社チャッ…
以下は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>…
express4 で cluster を使ってみる。まずは cluster.js というファイルを作る。 作る場所はとりあえず app.js と同じ階層にでもしておくといい。 これはあとで変更できる。ファイル内容は以下になる。 clusterの構文そのままで、 elseの部分にnodeのエントリ…
NodeJSはシングルプロセスなので、 プールした接続だとトランザクションを管理できない。 トランザクションを開始する場合は新規の接続を生成する必要がある。 トランザクションを利用しない単発のINSERTであれば、プールした接続を使いまわしても大丈夫。 …
redisを使っていると以下のエラーが出た。warning: possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit.これはredisというよりもnodeのエラー。 イベントを検知するリスナーを11個セ…
MySQL 以下を利用するのでインストールする。 https://github.com/felixge/node-mysql/#pooling-connections# npm install --save mysql --saveでpackage.jsonに追記するようにする。 【接続】 nodeJSはPHPとは違って起動時に接続を確保しておく。 接続には …