タグ : Node.js

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

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

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

前提

エラーが発生したコード(一部のみ抜粋)

imagemagick = require 'imagemagick'
child_process = require 'child_process'
 
spawned_child_process = child_process.spawn imagemagick.identify.path

エラーメッセージ

Error: spawn ENOENT
  at errnoException (child_process.js:988:11)
  at Process.ChildProcess._handle.onexit (child_process.js:779:34)

Error: spawn ENOENT の解決方法

node-imagemagick という npm module はインストールしていたけど、肝心の ImageMagick がインストールされていないのが原因でした。

brew list コマンドで ImageMagick がインストールされているか確認してみてもありませんでした。

brew list | grep imagemagick

インストールされていない場合、ImageMagick をインストールしましょう。

brew install xz # ImageMagick Dependencies
brew install imagemagick

そうすれば Error: spawn ENOENT エラーは発生せず画像アップロードできるようになるはずです。

参考情報

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

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

Node.js の公式ドキュメント にもそう書いてあります。

ガイドラインとして、もし exports と module.exports の間の関係が魔法のように 見えるなら、exports を無視して module.exports だけを使うようにしてください。

module.exports と exports の違いについて詳しく知りたいって方は下記の記事を読むといいんじゃないでしょうか。

今、ドットインストールの「Express入門」を Mac で学習するための覚え書き

今、ドットインストールの「Express入門」を Mac で学習するための覚え書きです。

「Express入門」を学ぶ前提

ドットインストールの「Express入門」は Express3 の前提でレッスンが用意されています。しかし、現在は Express4 がリリースされているので、何も考えずに進めていくと Express4 がインストールされてしまい思うようにレッスンを進めていくことができません。

このようなつまづきポイントがいくつかあるので、本記事ではそれらを補足していきます。

#01 Expressとはなにか?

まず、Node.js のバージョン管理ツール nvm を Mac にインストールする方法 を参考にしてインストールして、Node.js もインストールします。

そして、レッスン内では、

sudo npm install express -g

と書かれていますが、これを下記のように Express3 のバージョンを指定してインストールしましょう。

npm install express@3.21.2 -g

#03 はじめてのExpress

レッスン内では、

npm install express

と書かれていますが、これも下記のように Express3 のバージョンを指定してインストールしましょう。

npm install express@3.21.2

また、ブラウザからアクセスするには 192.168.33.93:3000 を入力するとなっていますが、Mac のターミナルで node app している場合 localhost:3000 もしくは 127.0.0.1:3000 を入力することで、アクセスできます。

#07 middlewareを作ってみよう

このレッスンでも、

sudo npm install nodemon -g

と sudo 使わずに、

npm install nodemon -g

で大丈夫です。

以上です。Mac で「Express入門」を学習する方のお役に立てたなら嬉しいです。

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

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

まず、下記のような Product model が定義されているとします。

# define Mongoose Product model
mongoose = require 'mongoose'
 
productSchema = new mongoose.Schema({
  # something
})
 
productSchema.virtual('discountPercentage').get ()->
  # calculate discountPercentage
  return discountPercentage
 
Product = mongoose.model 'Product', productSchema

そして、テストコードで discountPercentage virtual をスタブ化するコードは下記のような感じです。

# in test code
sinon = require 'sinon'
 
product = new Product()
 
console.log product.discountPercentage
# discountPercentage virtual の計算結果を返す
 
stub = sinon.stub product, 'get'
stub.withArgs('discountPercentage').returns 50
 
console.log product.discountPercentage
# 必ず 50 を返す
 
# 使い終わったら、忘れずに restore しましょう
stub.restore()

ポイントは sinon.stub mongooseInstance, ‘get’stub.withArgs(‘virtualName’).returns の部分で virtualName の返り値をスタブ化しているという点だけです。


参考情報

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

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

まず、アプリを起動しようとすると !!! MONGOOSE WARNING !!! と派手に怒られます。

$ node-dev app.js     
 
##############################################################
#
#   !!! MONGOOSE WARNING !!!
#
#   This is an UNSTABLE release of Mongoose.
#   Unstable releases are available for preview/testing only.
#   DO NOT run this in production.
#
##############################################################
 
Error: Cannot find module 'knox'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at Object.<anonymous> (/Users/bakorer/works/myapp/routes/admin/content.js:5:12)
    at Module._compile (module.js:456:26)
    at Module._extensions..js (module.js:474:10)
    at Object.nodeDevHook [as .js] (/Users/bakorer/.nvm/v0.10.28/lib/node_modules/node-dev/lib/hook.js:43:7)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
[ERROR] 10:45:41 Error

package.json に “mongoose”: “^3.8.13”, と記述されていたので npm install したら Mongoose version 3.9.7 がインストールされておりました。

$ npm list | grep mongoose
├─┬ mongoose@3.9.7 invalid
├─┬ mongoose-file@0.0.2
├─┬ mongoose-paginate@3.1.5
│ └─┬ mongoose@4.0.6
├── mongoose-query-paginate@1.0.1
npm ERR! invalid: mongoose@3.9.7 /Users/bakorer/myapp/node_modules/mongoose
npm ERR! not ok code 0

Mongoose の version を確認して使えそうな stable version に package.json を書き換えて、再度 npm install すれば OK なはず。

$ git diff
 
diff --git a/package.json b/package.json
index e56cf62..6b49881 100644
--- a/package.json
+++ b/package.json
@@ -15,7 +15,7 @@
-    "mongoose": "^3.8.13",
+    "mongoose": "3.8.13",

package.json の書き方は下記のサイトが詳しいので、あわせて読んでおくといいかもです。


参考情報