タグ : Node.js

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

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

Nodejs

続きを読む

[Node.js] Mongoose の virtual attributes を sinon で stub 化する

Mongoose の virtual attributes を sinon で stub 化する方法をご紹介します。

mongoose | マングース

続きを読む

[Node.js] MONGOOSE WARNING がでないように stable version を使おう

Node.js + Mongoose のアプリ開発で MONGOOSE WARNING という警告メッセージが表示されたら、 unstable バージョンを利用していると思われるので stable なバージョンを使いましょう。

mongoose | マングース

続きを読む

[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学園 15時限目 参加レポート #tng15

東京Node学園 15時限目の参加レポートです。

続きを読む

[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 つの落とし穴

[Mongoose] stream を使ってバッチ処理するときは noCursorTimeout: true オプションを設定すると幸せになれるかも

Express.js(Node.js) + Mongoose(MongoDB) という構成で、バッチ処理を長時間実行すると途中で終了してしまう問題が発生しました。

mongoose | マングース

続きを読む

[Node.js] RangeError: Maximum call stack size exceeded

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.js は実行環境とライブラリの2つから成っているもの

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つから成っているのです。