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>
いやはや。
今日は
限界なので続きは明日。