node.js express node app.jsでなぜ起動できないか


expressモジュールのexpressコマンドでテンプレートを作った場合に、なぜ「node app.js」コマンドで動かないのか。それは、express4の場合、bin/wwwというファイルを起動することでこのアプリケーションが動くようになっているからである。

package.jsonの中にはこう書かれている。つまり、bin/wwwを最初に起動するという指示がされている。(なお、このままでもherokuで動くので書き換える必要はない。)

“scripts”: {
“start”: “node ./bin/www”
},

ではwwwファイルは何をしているのか?最初に次のjsが記されている。このjsはつまり、アプリケーションのルートディレクトリ内のapp.jsをrequireしている。

var app = require(‘../app’);

requireされる先のapp.jsファイルには何が書かれているか。重要なのは最後に書かれている次の一文である。

module.exports = app;

exportは簡単にいうとreturnに近い。ここではapp.jsがrequireされたときに最後の部分でappを返すのである。これがどこに返されるか?元のbin/wwwを再度見てみる。

var app = require(‘../app’);

つまり、appという変数に、app.jsの中で様々処理を行ったappインスタンスを入れている。

そしてその後、wwwファイル内ではappに対して、大きく次の3つの処理をしている。httpサーバーを作成し、app(これはexpressアプリケーションだ)と結びつけ、そして、できたサーバーにポートを指定している。

var http = require(‘http’);

var server = http.createServer(app);

server.listen(port);

まとめ

なぜアプリケーションのルートディレクトリにあるapp.jsをいつもどおりにnode app.jsと動かしても正常な動きをしないのか。つまり、サーバーを作って、htmlをレンダリングして…という一連の動作が起きないのか。それはこのアプリケーションがwwwを起動することが前提の作りになっているからである。そしてwwwはapp.jsの中で作られるexpressアプリケーションにhttpサーバーを関連付けている。

今後の開発は基本的にapp.jsを更新していけばいい。ただしapp.jsに全てを書くのではなくて、app.jsではリクエストに対する処理をrouteの中にあるjsを起動することを指定する。そしてそのjsがjadeファイルをrenderすることでクライアント側にhtmlファイルを返す。

この投稿は役に立ちましたか? 役に立った 役に立たなかった 2 人中 1 人がこの 投稿 は役に立ったと言っています。

One comment

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

以下の数式は「スパム対策」です。空欄に正しい数字をいれてください。お手数をおかけします。 * Time limit is exhausted. Please reload the CAPTCHA.