[Node.js] module.exports と exports の違い
- 2015 8/9
Node.js + Mongoose のアプリ開発で MONGOOSE WARNING という警告メッセージが表示されたら、 unstable バージョンを利用していると思われるので stable なバージョンを使いましょう。
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 というモジュールをご紹介します。
動作例
> 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 に出力できるので、エラーやバグなどの調査に役立てることができそうです。
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
users がめっちゃいると RangeError: Maximum call stack size exceeded が発生して、途中で死ぬ。
async.eachSeries users, (user, next) -> user.save (error)-> return next() , (error) -> // ... |
下記のように process.nextTick や setImmediate で囲ってあげると解決する。
async.eachSeries users, (user, next) -> process.nextTick -> user.save (error)-> return next() , (error) -> // ... |
・Node.js – Maximum call stack size exceeded – Stack Overflow
・'Maximum call stack size exceeded' using async.forEachLimit · Issue #75 · caolan/async
Nodeビギナーズブックを読んで、“Node.jsは実行環境とライブラリの2つから成っている” という表現が個人的にしっくりきたので、忘れないようにメモしておきます。
サーバサイドJavaScript
最初にJavaScriptが日の目を見たのは、ブラウザ上でした。 しかしこれは単なるコンテキストに過ぎません。 コンテキストによってその言語でできることは決まってきますが、 それはその言語自体ができることとイコールというわけではありません。 JavaScriptは”完全な”言語であり、様々なコンテキストで使えます。 他の言語でやっていることは、すべてJavaScriptでもできます。
Node.jsもまた、ひとつのコンテキストに過ぎません。 Node.jsによって、JavaScriptはバックエンド、ブラウザの外で動作できるのです。
バックエンドでJavaScriptが動作するには、インタープリターで変換され、 そして実行されなければなりません。これをNode.jsが行います。 内部ではGoogleのV8 VMが利用されています。 V8 VMはGoogle Chromeが使用しているJavaScriptの実行環境そのものと同じです。
それに加えて、Node.jsにはたくさんの便利なモジュールが同梱されています。 全てを1から作る必要はないのです。例えばコンソールに文字列を出力するモジュールなどがあります。
つまりNode.jsは、実行環境とライブラリの2つから成っているのです。