本当はlinux上でやりたかったんですが、サーバーが故障なうのためwindowsで。。。
windowsにはこれまでもCygwinで入れることはできたんですが、
Cygwinが好きになれずにいたのでこれ幸いにと入れてみました。
※ node.jsやexpressについてはこちら
- node.js
http://www.atmarkit.co.jp/fwcr/rensai2/nodejs01/01.html
- express(node.jsのフレームワーク)
http://expressjs.com/
- ejs(テンプレートエンジン)
http://embeddedjs.com/
node.exeを動かしてみる
node.exeをダウンロード
expressをダウンロード
ver:2.4.3
https://github.com/visionmedia/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 件のコメント:
コメントを投稿