カテゴリー : Node.js

[Node.js] socket.io ではなくて socketio を npm install して Cannot find module ‘socket.io’ エラーでた

socket.io を使いたくて npm install socketio –save でインストール後に require(‘socket.io’) したら Error: Cannot find module ‘socket.io’ が発生して「なんでだろう…?」って数十分ぐらい悩みました。

$ node index.js
 
module.js:327
    throw err;
    ^
 
Error: Cannot find module 'socket.io'
    at Function.Module._resolveFilename (module.js:325:15)
    at Function.Module._load (module.js:276:25)
    at Module.require (module.js:353:17)
    at require (internal/module.js:12:17)
    at Object.<anonymous> (/Users/username/works/sample/index.js:9:16)
    at Module._compile (module.js:409:26)
    at Object.Module._extensions..js (module.js:416:10)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Function.Module.runMain (module.js:441:10)

結果としては socketio が使うべきモジュールではなくて正しくは socket.io というオチでした。package.json を下記のように修正して npm install し直したら無事に require(‘socket.io’) できました。

diff --git a/package.json b/package.json
index 30cdfac..84192a7 100644
--- a/package.json
+++ b/package.json
@@ -16,6 +16,6 @@
-    "socketio": "^1.0.0"
+    "socket.io": "^1.5.1"
   }
 }

socketio という紛らわしいパッケージ名はつけないで頂きたいですね。

[Node.js] npm package の実行ファイルは node_modules/.bin にシンボリックリンクで存在する

Node.js で npm install した package の実行ファイルは node_modules/.bin ディレクトリ配下にシンボリックリンクが自動作成されます。

npm | エヌピーエム

続きを読む

[Node.js] CSVTOJSON を使って CSV から JSON ファイルに変換する

CSVTOJSON という npm モジュールを利用して、CSV を JSON ファイルに変換するスニペットをご紹介します。

csvtojson をインストールする

npm install -g csvtojson

csvtojson を使って CSV から JSON ファイルへ変換する

var Converter=require("csvtojson").Converter;
var csvConverter = new Converter({
  constructResult: false,
  toArrayString: true
});
 
var pathName = "/Users/username/Downloads/";
var readStream = require("fs").createReadStream(pathName + "sample.csv");
var writeStream = require("fs").createWriteStream(pathName + "sample.json");
 
readStream.pipe(csvConverter).pipe(writeStream);

以上です。

Node.js のバージョンを自動で切換えてくれる avn

Node.js のバージョンを自動で切換えてくれる npm モジュール avn が便利なのでご紹介します。(最終更新日 2017/04/15)

Node.js

続きを読む

[Node.js] Error: spawn ENOENT の解決方法

Node.js の child_process.spawn で Error: spawn ENOENT というエラーが発生したときの解決方法をご紹介します。

Node.js | ノードジェイエス

結論から書くと child_process.spawn の第一引数に渡していた path に実行するコマンドがないというのが原因でした。

今回のケースだと ImageMagick コマンドです。

続きを読む

[Node.js] module.exports と exports の違い

結論だけ書いておくと、よく分からないなら module.exports を使いましょう。

Nodejs

続きを読む

[Jade] mixin の命名規則

Jade には mixin という template を module 化する機能があります。

+hoge(arg) みたいな感じで method ライクに template を呼び出せるのですが、method みたいなだけあって命名規則はどうなってるんだろうと思って軽く調べてみました。

下記は、Jade のサンプルコードです。

mixin dialog-title(title)
  .dialog
    h1= title
    p stuff

snake_case, lowerCamelCase のいずれかでもなく、ハイフンを区切り文字として使っており dialog-title と定義されていました。

ついでに .jade ファイルについても見てみましょう。

extend-layout.jade とあるようにファイル名についてもハイフンが区切り文字として使われていました。

Jade の mixin をハイフン区切りにしておくと、JavaScript の method の命名規則と衝突しないので grep しやすくて良い感じになりそうですね。

[Node.js] phantom モジュールの addCookie メソッドの引数が変更された

Node.js 向けの PhantomJS wrapper である phantom の addCookie メソッドの引数がバージョン 0.7.1 から 0.7.2 で変更になりました。

そのため addCookie メソッドを使ってる箇所がエラーで動かなくなってしまいました。

phantom stdout: TypeError: incompatible type of argument(s) in call to addCookie(); candidates were
    addCookie(QVariantMap)
 
 
phantom stdout:   /u/apps/myapp/shared/node_modules/phantom/shim.js:5621
  /u/apps/com/shared/node_modules/phantom/shim.js:4526
  /u/apps/com/shared/node_modules/phantom/shim.js:4502
  /u/apps/com/shared/node_modules/phantom/shim.js:4382
  /u/apps/com/shared/node_modules/phantom/shim.js:4370

変更点は、

addCookie: (name, value, domain, cb=->) ->

から

addCookie: (cookie, cb=->) ->

に arguments が変更されているだけです。

なので name, value, domain と個別に引数に渡されていたのを cookie オブジェクトにまとめて渡すように、addCookie メソッドを呼び出しているコードを修正すれば OK です。

詳しくは上記の issue と pull request を読むと分かりますが PhantomJS の API に合わせる方針で修正されたようです。

[Node.js] console.log や console.error などの出力の先頭に時刻を付ける log-timestamp

Node.js で console.log や console.error などの出力の先頭に時刻を付ける log-timestamp というモジュールをご紹介します。

動作例

> console.log('Before log-timestamp');
Before log-timestamp
 
> require('log-timestamp');
 
> console.log('After log-timestamp');
[2015-02-03T13:45:13.198Z] After log-timestamp
 
> console.error('Error')
[2015-02-03T14:15:18.093Z] Error

log-timestamp を使うことでエラーの発生時刻 error.log に出力できるので、エラーやバグなどの調査に役立てることができそうです。


参考情報

bahamas10/node-log-timestamp

bahamas10/node-log-prefix

[Node.js] Error: bind EADDRINUSE

Node.js (Express) で forever restart 後に bind EADDRINUSE エラーが頻発する障害が発生しました。

Error: bind EADDRINUSE はそのポートが既に使われてる場合に発生するエラーでして、同じ障害に悩まされた人のために解決方法をメモしておきます。

エラーメッセージ

Error: bind EADDRINUSE
    at errnoException (net.js:904:11)
    at net.js:1084:30
    at Object.12:1 (cluster.js:592:5)
    at handleResponse (cluster.js:171:41)
    at respond (cluster.js:192:5)
    at handleMessage (cluster.js:202:5)
    at process.EventEmitter.emit (events.js:117:20)
    at handleMessage (child_process.js:318:10)
    at child_process.js:392:7
    at process.handleConversion.net.Native.got (child_process.js:91:7)
    at process.<anonymous> (child_process.js:391:13)
    at process.EventEmitter.emit (events.js:117:20)
    at handleMessage (child_process.js:318:10)
    at Pipe.channel.onread (child_process.js:343:11)

まず netstat コマンドで node.js サーバーのプロセスで使うポートが他のプロセスに使われていないか確認します。

$ netstat -nltp | grep 3000
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:3000                0.0.0.0:*                   LISTEN      6653/phantomjs

今回は phantom.js が 3000 番ポートで起動していたようでした。phantom.js は利用しているものの他のポート番号を指定して起動させるようにしていたので 3000 番ポートを使っていた理由は不明です。プロセスを停止させて問題ない場合、 ps aux | grep phantomjs で phantom.js の PID (プロセス番号) を特定して kill コマンドでプロセスを終了させます。

最後に forever や pm2 もしくは node コマンドなどで node サーバーを起動させて、エラーログに Error: bind EADDRINUSE が出力されていないことを確認すれば完了です。


参考情報

Node.jsの開発で `warn – error raised: Error: listen EADDRINUSE` って怒られるときの対応 – Qiita

node.js – Nodejs application Error: bind EADDRINUSE when use pm2 deploy – Stack Overflow

Linux ソケット・プログラミングの 5 つの落とし穴