2011年10月2日日曜日

node.exe使ってみた

windows exeで動くnode.jsが公開されました。
本当はlinux上でやりたかったんですが、サーバーが故障なうのためwindowsで。。。

windowsにはこれまでもCygwinで入れることはできたんですが、
Cygwinが好きになれずにいたのでこれ幸いにと入れてみました。

※ node.jsやexpressについてはこちら


node.exeを動かしてみる
node.exeをダウンロード
下記の「node.exe Windows executable」からダウンロード。
http://nodejs.org/

ダウンロードしたexeをクリックして起動

コンソールから使ってみる



expressをのっけてみる
expressをダウンロード

ver:2.4.3
https://github.com/visionmedia/express

ejsをダウンロード。
ver:0.4.3

expressのその他依存ライブラリをダウンロード
依存ライブラリは「package.json」に記載
  "dependencies": {
    "connect": ">= 1.5.2 < 2.0.0",
    "mime": ">= 0.0.1",
    "qs": ">= 0.0.6"
  },

connectをダウンロード
1.7.1

qs
0.3.1

mime

こんな感じ




サーバーを起動する
外部ファイルの実行はコマンドラインから行う。
C:\wk\20111001>.\node.exe .\express\examples\ejs\app.js
node.js:195
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: Cannot find module 'connect'
    at Function._resolveFilename (module.js:318:11)
    at Function._load (module.js:263:25)
    at Module.require (module.js:341:17)
    at require (module.js:352:17)
    at Object.<anonymous> (C:\wk\20111001\express\lib\express.js:12:15)
    at Module._compile (module.js:420:26)
    at Object..js (module.js:459:10)
    at Module.load (module.js:335:31)
    at Function._load (module.js:294:12)
    at Module.require (module.js:341:17)

ド━━━(゜ロ゜;)━━ン!!
エラーで起動しない;;;;


パスが通ってないと。
調べると、下記2つの方法があると。
・NODE_PATHで設定 ← 今回はこっち
・require.paths.push()で設定

C:\wk\20111001>set NODE_PATH=.;C:\wk\20111001\
※ ↓でもよい
C:\wk\20111001>set NODE_PATH=.

C:\wk\20111001>.\node.exe .\express\examples\ejs\app.js
Express app started on port 3000
起動したよー。



ブラウザからアクセスする
ローカルにnodeで起動したexpressのサーバーにアクセスする。

アクセスできたがエラーが。
Error: failed to locate view "users"
    at Function.compile (C:\wk\20111001\express\lib\view.js:58:15)
    at ServerResponse._render (C:\wk\20111001\express\lib\view.js:416:18)
    at ServerResponse.render (C:\wk\20111001\express\lib\view.js:317:17)
    at Router.<anonymous> (C:\wk\20111001\express\examples\ejs\app.js:27:7)
    at done (C:\wk\20111001\express\lib\router\index.js:250:22)
    at middleware (C:\wk\20111001\express\lib\router\index.js:244:9)
    at param (C:\wk\20111001\express\lib\router\index.js:227:11)
    at pass (C:\wk\20111001\express\lib\router\index.js:232:6)
    at Router._dispatch (C:\wk\20111001\express\lib\router\index.js:255:4)
    at Object.handle (C:\wk\20111001\express\lib\router\index.js:45:10)

調べると、テンプレファイルのパスが解決できず、エラーになっていた。
[原因 - 概要]
直接的には「express\lib\view\view.js」のln67 「stat(this.path);」(パスの存在チェック)でfalseになっている。

[原因 - 詳細]
「express\lib\view\view.js」の「View.prototype.resolvePath」で
相対パス指定の際にパスを絶対パスに変換する処理がある。
絶対パスか否かの判定を「1文字目が/か」で行っているため、「C:\」が相対パスと認識されて誤ったテンプレファイルのパスが生成されてしまっている。

今回は絶対パスの判定を「/」でなく「C:\」で行うように変えて動かした。
 View.prototype.resolvePath = function(){
   var path = this.view;
   // Implicit engine
   if (!~this.basename.indexOf('.')) path += this.extension;
   // Absolute
!  //if ('/' == path[0]) return path;
+  var target = ' C:\\', str = ' ' + path;
+  if (str.indexOf(target) !== -1) return path;
   // Relative to parent
   if (this.relative && this.parent) return this.parent.dirname + '/' + path;



再度アクセス、動いたー
ヤッタネ!!(v゜ー゜)ハ(゜▽゜v)ィェーィ♪



0 件のコメント:

コメントを投稿