読者です 読者をやめる 読者になる 読者になる

日々精進

新しく学んだことを書き留めていきます

node

yo angularを実行すると、「You don't seem to have a generator with the name angular installed」エラー

generator-angularはインストールしているのになぜ・・・と思いyo doctorを実行すると 以下のメッセージが出た。 [Error] NPM root value is not in your NODE_PATH [info] NODE_PATH = /usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript NPM ro…

Nodeで実行中のjsファイルのファイル名を取得する

executingFileName = process.argv[1].replace(/^.*[\\\/]/, '')参考:javascript - How to pass command line arguments to Node.js? - Stack Overflow

nodeでHOMEディレクトリのパスを取得する

logs4jsを使ってログを出力しているが、ログの出力先を~/logs/app.logのように指定しても出力できなかった。 以下のようにすると出力できた。 log4js.configure({ appenders: [{ "type": "dateFile", "filename": "#{process.env["HOME"]}/logs/#{executingF…

npm installでパッケージをインストールしようとしたら「npm ERR! network tunneling socket could not be established...」

原因はプロキシ設定とhttps接続を使っていること。 以下を実行すると直った。 npm config set proxy http://yourproxy npm config set registry http://registry.npmjs.org/proxyにhttpsのプロキシを指定したらそれだけでいけるかも。 参考:Node.js - Windo…

nodeのプログラムを実行すると「Error: Cannot find module '../build/Debug/iconv.node'」エラー

node_module/iconvが壊れていることが原因っぽい。前はちゃんと動いてたんだけど。。 以下のようにしてnode_module/iconvを自分でビルドし直すと直る。 cd ./node_module/iconv node-gyp configure node-gyp build参考:linux - Cannot find module /build/D…

node.jsでログの行頭に日時を表示する

log4jsを使うと簡単にできる。 npm install log4jsでインストールし、以下のようにしてログを出すと日時がつく。ログレベルも指定出来る。 var log4js = require('log4js'); var logger = log4js.getLogger(); logger.debug("Some debug messages");ログレベ…

npmでパッケージをインストールした後、コマンドを実行するとCommand not foundになる

原因はPATHが通っていないこと。 ~/.zshrcに以下を追加すると直った。 export PATH=/usr/local/share/npm/bin:$PATH参考:osx - Command not found after npm install in zsh - Stack Overflow

macでnpm install -g node-gypを実行すると、「Error: No compatible version found: mkdirp@'^0.5.0'」 エラー

nodeのバージョンが古いことが原因。0.10.5だったのを0.10.31にupdateしたら直った。 nodeのupdateは英語版公式サイトからインストーラをダウンロードしてインストールする。 node.js Node.js 日本ユーザグループは情報が古いので注意(最新安定版のバージョ…

working directoryを変更する

下記メソッドで変更出来る。 process.chdir('/Users')cronなどからnodeを実行するとworking directoryがプロジェクトのルートディレクトリにならないのに困っていたが、これで解決出来そう。

EC2で同時接続数が700ぐらいから伸びない現象があった

現象は以下。 ・Socket.ioでクライアントと接続している ・同時接続数が700ぐらいになると新規に接続出来なくなる ・しばらくすると既存の接続も切れ始める 最初はファイルディスクリプタの上限設定を疑ったが、上限を変更しても改善しなかった。 原因はip_c…

オブジェクトの内容をすべて表示する

以下でできる。 var util = require('util'); console.log(util.inspect(obj,false,null));参考:Wokashi: Node.jsでオブジェクトの中身を全て表示する

macのnodeのupdate

Macのnodeのアップデートは公式サイトからインストーラをダウンロードして実行するのが一番簡単っぽい。 npmを使ってアップデートする方法はなぜかsudo n stableを実行するとエラーになりうまくいかなかった。 ほんとはnvmとか使うのがいいんだろうけど、ひ…

webstorm7でKarmaが使えるようになったけど、Karmaはnode.jsのテストは実行出来ない

Karmaを使ってautorunとcode coverageやろうと思ったんだけど、Karmaはブラウザでのテスト実行しかサポートしてないらしい。残念。。 参考:node.js - How to test nodejs backend code with Karma (testacular) - Stack Overflow

should.not.exist(obj)を実行するとTypeError: Object # has no method 'exist'

mochaでテストを書いていて、nullかどうかをassertするのにshould.not.exist(obj)と書いたところ、以下のエラーが出た。 TypeError: Object # has no method 'exist'これはshouldがロードされていないため。下記を実行すると直った。 should = require "shou…

mochaでファイル単位でテストを実行する方法

2013-05-02 - 日々精進で紹介した方法をアレンジしてファイル単位で テストを実行できるようにした。 あとsearch pathを設定する方法 - 日々精進のsearch pathを設定する方法も使ってテストファイル内でもrequire "hoge"できるようにした。 mocha.coffeeを↓…

search pathを設定する方法

自分で作ったクラスをrequireで読み込むとき、相対パスを書くのが面倒なので search pathを設定できないものか、と思っていたらやる方法があった。 process.cwd()はプロジェクトのルートディレクトリ(多分nodeのプロセスのカレントディレクトリ)の絶対パスを…

aws-sdkを使ったクラスをMochaでテストするとうまく動かない

aws-sdkを使ってSNS経由でメールを送信するクラスを実装し、Mochaでテストするとメールが送信されず困った。 原因は非同期処理なのにdoneを使っていなかったのでレスポンスが返ってくる前にテストが終了してしまっていたこと。 しばらく触ってないとこんな初…

socket.ioの接続数が増えるとエラー

EC2だと700〜1000接続ぐらいでエラーが出てそれ以上接続数が増えない。サーバ側で出るエラーメッセージは以下。後で調査する。 debug: fired close timeout for client AV0UBEHqIjWeD0bb28jn info: transport end (close timeout) debug: cleared heartbeat …

リクエストが送信されない

requestモジュールを使ってリクエストを送信したところ、サーバにリクエストが届かない現象が起きた。 原因はプロキシサーバ経由でないとインターネットにアクセスできない環境なのにプロキシを設定していないこと。 以下のようにプロキシ設定してやればOK。…

macでnpm install -gしたパッケージを実行するとcommand not foundになる

下記コマンドでcoffee-scriptをインストールした後、coffeeを実行するとcommand not foundになった。 npm install -g coffee原因はパッケージのインストール先にPathが通っていないから。 以下を実行してPathを通せば直る。 export PATH=/usr/local/share/np…

long pollingでsocket.ioサーバに接続しているクライアントがあるとログが出まくる

以下のようなメッセージが出まくり、1,2日でログが8GBぐらいたまってしまうという現象が起きた。 debug: setting request GET /socket.io/1/xhr-polling/xIPscInKp3pX77b0NeGy?t=1377280474574 debug: setting poll timeout debug: clearing poll timeou…

squidはwebsocketに対応してない

HTTP1.0にしか対応してないらしい。 よってsquidプロキシサーバを経由してWebSocketで通信できない。まじか。。 こてさきAjax:HTTPで、サーバーPushサービス Server-Sent Events - livedoor Blog(ブログ)

80番ポートをlistenする方法

○root権限でnodeを実行する この方法は以下の問題があるのでやるべきでない。 ・nodeのプロセスがroot権限を持つのでセキュリティリスクがある ・rootユーザがnodeを実行できるようにnodeをインストールしたりする必要がある。これが結構めんどくさい。前に…

pm2,foreverでスクリプトを実行するとSyntaxError: Unexpected token ILLEGAL

これは以下のように#で始まるコメントがシェルスクリプトに入っていることが原因。 # comment 直接シェルスクリプトを実行すると問題ないんだけどなぁ。同じようにコメントは無視してほしい。

node-pm2でnodeを起動したらエラーになる

node-pm2でnodeを起動したら以下のエラーを吐く。 [start_dev_rate_distribution_server.sh err (l621)] SyntaxError: Unexpected token ILLEGAL [start_dev_rate_distribution_server.sh err (l622)] at Module._compile (module.js:439:25) [start_dev_rat…

EC2でsudo nodeを実行するとcommand not found

EC2はパスが特殊だからっぽい。 以下のようにシンボリックリンクを作成すれば直る。 下記パスはnvm使ってる場合。 sudo ln -s /root/.nvm/v0.10.13/bin/node /usr/bin/node sudo ln -s /root/.nvm/v0.10.13/lib/node /usr/lib/node sudo ln -s /root/.nvm/v0…

nodeのインストールを速くする方法

nodeをソースコードからビルドすると結構時間がかかる。EC2のマイクロインスタンスだと数十分かかる。 nvm経由でインストールするとビルド済みバイナリをダウンロードしてくれるようで、すぐにインストールできる。 インストール時のコマンドは以下サイト参…

80番ポートをlistenするとwarn: error raised: Error: listen EACCES port 80

well known portはrootユーザでないとlistenできない。 sudo nodeすればlistenできるようになる。 参考:http - Node.js EACCES error when listening on most ports - Stack Overflow

80番ポートでhttpとwebsocket両方のリクエストを処理する

socket.ioを使えばできるらしい。 apache - Is it possible to use port 80 for both HTTP and web socket traffic? - Stack Overflow ロードバランサを使っていれば以下のようにしてもOK。 ・LBへのリクエストは80番ポートで受ける ・LBはnodeサーバの3000…

websocketで接続出来ないと例外が発生する

wsモジュールを使って接続しようとしてできないと以下の例外が発生する。 events.js:66 throw arguments[1]; // Unhandled 'error' event ^ Error: connect ECONNREFUSED at errnoException (net.js:768:11) at Object.afterConnect [as oncomplete] (net.js…

80番ポートをlistenするとError: listen EACCESエラーになる

80等の特権ポート(well-known portと同義?)をlistenするにはsudoで実行しないといけないらしい。 参考:http://rockf.es/blog/2012/02/02/node/

nodeでグローバルな定数を使う方法

Object.definePropertyを使えばいいらしい。なるほどー。 javascript - How do you share constants in NodeJS modules? - Stack Overflow

step.jsのgroupを使ったときに次の関数に渡される結果がすべてundefinedになる

以下のコードだとnumsがすべてundefinedの配列になる。 step( -> group = this.group() func = (done) -> done(1) for i in [0..10] setTimeout func(group), 100 , (err, nums) -> console.log nums )これは非同期関数のfuncの第一引数がエラーオブジェクト…

step.jsとcoffeescriptを一緒に使うと挙動がおかしくなる

step.jsを使って非同期処理をわかりやすくしようとしたらはまった。 step(-> request uri:uri headers: headers , this , -> console.log arguments )上記だと二段目の関数の引数にrequestオブジェクトが渡される。 responseが取れなくて、なぜ〜?と悩んで…

非同期メソッドのテストとpredictableNextTick

非同期メソッドのテスト方法についての記事にちょっと面白そうなことが書いてあった。 Make Your Tests Deterministic - How To Node - NodeJS 内容は以下。 非同期なメソッドを複数回呼び出しているメソッドのテストは難しい。 その理由は非同期なメソッド…

nodeのメモリリーク調査

アプリでメモリリークが起こっていたので調査したんだけど、これがちゃんと調べられるツールがなくて困った。 ・node-inspectorを使ってみたがだめ ↓を参考にnode-inspectorを使ってみたがなぜかProfilesボタンがブラウザに出てこず断念。チュートリアルと全…