mvc (2)

昨晩のナニは key_file.js が微妙だった模様。てか Oauth のことあまり分かってない。とりあえず諸々確認の方向でナニ。Facebook のなんちゃら支援ツールを作成してみる方向なんですが Graph API 分かりにくい。

とは言え

とりあえず金曜日の続きを掘削の方向。
残が以下とのメモがありました。

  • 500 および 404 の処理について
  • Setup ejs views as default, with .html as the extension
  • Some dynamic view helpers
  • bootControllers 手続き

順に見ていきましょうね。

500 および 404 の処理について

ええと、app.error は Error なオブジェクトが throw されたら制御がこちらに、という理解で良いのかな。
あと、404 は最後の app.use ってことで、という理解で良いのかどうか。
# このあたり、なんとなくな理解でちょっと微妙

  // Example 500 page
  app.error(function(err, req, res){
    console.dir(err)
    res.render('500');
  });

  // Example 404 page via simple Connect middleware
  app.use(function(req, res){
    res.render('404');
  });

Setup ejs views as default, with .html as the extension

以下な部分。

  app.set('views', __dirname + '/views');
  app.register('.html', require('ejs'));
  app.set('view engine', 'html');

これ、view なディレクトリは views で、とかな指定なのかどうか。あるいは_app.register() can be used to map engines to file extensions_という記述がドキュメントにあるのですが、そーゆーことなのは分かるんですが ejs なナニをちゃんと理解できてないですね。

ejs?

javascript なスクリプトレットが書ける模様。例えば views/layout.html とかが以下な記述。

<html>
  <head>
    <title>Express - MVC Example</title>
    <link rel="stylesheet" href="/style.css" />
  </head>
  <body>
    <%- body %>
  </body>
</html>

Some dynamic view helpers

定義が以下なんですが

  app.dynamicHelpers({
    request: function(req){
      return req;
    },

    hasMessages: function(req){
      if (!req.session) return false;
      return Object.keys(req.session.flash || {}).length;
    },

    messages: function(req){
      return function(){
        var msgs = req.flash();
        return Object.keys(msgs).reduce(function(arr, type){
          return arr.concat(msgs[type]);
        }, []);
      }
    }
  });

それぞれ view 配下で find|xargs grep してみたら以下。

find . -type f -print0 | xargs -0 -e grep -nH -e request
./404.html:1:<h1>Cannot find <%= request.url %></h1>

あるいは以下。

find . -type f -print0 | xargs -0 -e grep -nH -e hasMessages
./messages.html:1:<% if (hasMessages) { %>

これは messages も関係あるらしい。view/messages.html が以下。

<% if (hasMessages) { %>
  <ul id="messages">
    <% messages().forEach(function(msg){ %>
      <li><%- msg %></li>
    <% }) %>
  </ul>
<% } %>

なるほど。

bootControllers 手続き

定義が以下。controllers ディレクトリ配下にあるファイルに対して云々らしい。

function bootControllers(app) {
  fs.readdir(__dirname + '/controllers', function(err, files){
    if (err) throw err;
    files.forEach(function(file){
      bootController(app, file);
    });
  });
}

bootController 手続き面白いんですが、挙動確認必要ですね。

てことで

localhost:3000 にアクセスしてみたら

Application Index

Try visiting one of the following urls:

/users
/users/1
/users/1.json
/users/1/edit
/accounts (404, non existent)
/users/1.foo (500, unsupported format)

みたいなコンテンツが出てきた。うーん。controllers/app.js が以下なんですが

module.exports = {
  
  // /
  
  index: function(req, res){
    res.render();
  }
};

どうやったら res.render でアレが出てくるのかと。

あら

views/app/index.html がありました。以下だそうでorz

<h1>Application Index</h1>
<p>Try visiting one of the following urls:</p>
<ul>
    <li><a href="/users">/users</a></li>
    <li><a href="/users/1">/users/1</a></li>
    <li><a href="/users/1.json">/users/1.json</a></li>
    <li><a href="/users/1/edit">/users/1/edit</a></li>
    <li><a href="/accounts">/accounts (404, non existent)</a></li>
    <li><a href="/users/1.foo">/users/1.foo (500, unsupported format)</a></li>
</ul>

いやはや。

今日は

限界なので続きは明日。