ラベル express の投稿を表示しています。 すべての投稿を表示
ラベル express の投稿を表示しています。 すべての投稿を表示

2011年10月31日月曜日

Amazon EC2を始める(node.js - express編)

経緯
Amazon EC2を始める(導入編)
Amazon EC2を始める(SSL編)
Amazon EC2を始める(SCP編)
Amazon EC2を始める(Apache編)
Amazon EC2を始める(node.js編)
の続きです。


概要
node.jsのフレームワークであるexpressを入れる際のログです。
※ node.jsとnpmがインストールされていない人は↓こちらでインストールしてください。
Amazon EC2を始める(node.js編)

expressについては↓こちら
http://expressjs.com/


手順
1. expressをインストール

expressをグローバルインストールします。
※ グローバルインストールとローカルインストールの違いは↓こちらがわかりやすいです。
npm installコマンドの-gオプションについて

$ sudo npm install express -g
/usr/local/bin/express -> /usr/local/lib/node_modules/express/bin/express
mkdirp@0.0.7 /usr/local/lib/node_modules/express/node_modules/mkdirp 
mime@1.2.4 /usr/local/lib/node_modules/express/node_modules/mime 
qs@0.3.1 /usr/local/lib/node_modules/express/node_modules/qs 
connect@1.7.2 /usr/local/lib/node_modules/express/node_modules/connect 
express@2.5.0 /usr/local/lib/node_modules/express 

# 確認します。
$ ls -l /usr/local/lib/node_modules
total 8
drwxr-xr-x  6 nobody ec2-user 4096 Oct 31 11:25 express
drwxr-xr-x 11 root   ec2-user 4096 Oct 30 16:35 npm

# アプリのひな形を作成
$ cd /usr/local/src/
$ express chatapp

   create : chatapp
   create : chatapp/package.json
   create : chatapp/app.js
   create : chatapp/public
   create : chatapp/routes
   create : chatapp/routes/index.js
   create : chatapp/views
   create : chatapp/views/layout.jade
   create : chatapp/views/index.jade
   create : chatapp/public/javascripts
   create : chatapp/public/images
   create : chatapp/public/stylesheets
   create : chatapp/public/stylesheets/style.css

   dont forget to install dependencies:
$ cd chatapp && npm install

$ cd chatapp

# アプリを起動
$ node app.js node.js:134 throw e; // process.nextTick error, or 'error' event on first tick ^ Error: Cannot find module 'express' at Function._resolveFilename (module.js:326:11) at Function._load (module.js:271:25) at require (module.js:355:19) at Object.<anonymous> (/usr/local/src/chatapp/app.js:6:15) at Module._compile (module.js:411:26) at Object..js (module.js:417:10) at Module.load (module.js:343:31) at Function._load (module.js:302:12) at Array.<anonymous> (module.js:430:10) at EventEmitter._tickCallback (node.js:126:26) # ⇒ 依存ライブラリがないので起動できない。 # 依存ライブラリをインストール $ npm install jade@0.16.4 ./node_modules/jade ├── mkdirp@0.0.7 └── commander@0.2.1 express@2.5.0 ./node_modules/express ├── mkdirp@0.0.7 ├── mime@1.2.4 ├── connect@1.7.2 └── qs@0.3.1 # アプリを起動 $ node app.js Express server listening on port 3000 in development mode


2. ポートを空ける
起動メッセージにもあるように、このアプリはポート3000で動いています。
app.jsのポート3000を80に変更するかEC2のFireWall設定で3000番に穴を空けるかの対応が必要ですが、毎回のことなので、3000番に穴をあけることにしました。

「AWS Management Console」の左ナビで「Security Groups」を選択します。
インスタンスに紐づけているグループの「Inbound」タブで「Port range」に「3000」を入力し、「+Add Rule」をクリックします。
続いて「Apply Rule Changes」をクリックすると、反映されます。


3. アプリ確認
http://ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com:3000/
自サーバーのport3000にアクセスすると↓「Welcome to Express」と表示されればokです。

ちなみにこれはexpressのデフォルトのテンプレートエンジンのjadeによる出力です。

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)ィェーィ♪