カテゴリー : Node.js

[Mongoose] 途中から field に default 定義を追加する場合の実装方針

Mongoose で途中から field に default 定義を追加する場合の実装方針をご紹介します。

mongoose

続きを読む

[Mongoose] ObjectId のバリデーションには mongoose.Types.ObjectId.isValid を使おう

Mongoose で ObjectId のバリデーションをするには mongoose.Types.ObjectId.isValid というメソッドがあるのでこれを使いましょう。

mongoose

続きを読む

[Mongoose] 特定の field が変更されたかは isDirectModified, isModified, modifiedPaths で確認できる

Mongoose では document の特定の field に変更があったかどうかを isDirectModified や isModified, modifiedPaths などの method で確認できます。

mongoose

続きを読む

[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] TypeError: Cannot read property ‘options’ of undefined

Mongoose でスキーマ定義に type: ObjectId としている field にオブジェクト型のデータが入ってると TypeError: Cannot read property ‘options’ of undefined エラーが発生します。

mongoose

続きを読む

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

[Node.js] node-wkhtmltopdf を使う

Node.js で wkhtmltopdf を使う方法をメモ。
(最終更新日:2014/11/28)

node-wkhtmltopdf

A Node.js wrapper for the wkhtmltopdf command line tool.

wkhtmltopdf

ということで、npm module だけだと使えないので wkhtmltopdf はインストールする必要があります。

wkhtmltopdf のインストール

# the wkhtmltopdf formula is now inactive but still available in the boneyard repository
brew tap homebrew/boneyard
 
# Install wkhtmltopdf
brew install wkhtmltopdf

wkhtmltopdf コマンドで、PDFを生成できることを確認します。

wkhtmltopdf "http://google.com" google.pdf

以上です。