Node.js + Express で ASP.NET ライクな ルーティング を行う ミドルウェア

0 件のコメント

Node.js + Express で Webアプリケーション開発 を行うとき困ったのがルーティング。 そこで ASP.NET MVC のような実装ができる Express 向け ミドルウェア "express-junction" を作成しました。

概要

"express-junction" は Express上 で動くミドルウェアです。

「開発時に一定ルール」を設けることで URLルーティング を /コントローラー名/アクション名 へ自動で割り振られるようにできます。

「開発時の一定ルール」とは具体的に以下の2点です。

  • Controller の配置場所は "/controllers" フォルダ配下
  • View テンプレート の配置場所は "/views/{コントローラー名}" フォルダ配下

詳しい実装はこの後の 使い方 で解説します。

インストール

npm install express-junction

依存関係に "express" が入っているので、 上記をいきなり実行することで "express" 含めてまとめてインストールできます。

使い方

簡単な実装例を以下で見ていきます。

ディレクトリ、ファイル

ディレクトリ構成は以下の通りです。 作成するのは 3ファイル のみです。 ディレクトリ構成とファイル保存場所が決まっている点が要注意です。 コントローラー名、アクション名は自由に設定できます。

%PROJECT_ROOT%
│  app.js
│  package.json
│  
├─controllers
│      home.js
│      
├─node_modules
│  ├─express
│  ├─express-junction
│  └─express-session
│          
└─views
    └─home
            index.ejs

/app.js

var express = require("express");
var session = require("express-session");
var junction = require("express-junction");

// Expressインスタンス作成
var app = express();

// テンプレートエンジンの設定
app.set("views", "./views");
app.set("view engine", "ejs");

// ミドルウエアの設定
app.use("/public", express.static("public"));
app.use(session({
    secret: "YOUR SECRET KEY IS HERE",
    resave: false,
    saveUninitialized: true,
    name: "sid"
}));
app.use(junction());
app.use("/", junction.router());

// サーバー開始
app.listen(3000);

"express-junction" は "express-session" を使用していることを前提としているので、"express-session" ミドルウェアよりあとに設定します。

/controllers/home.js

var {Controller, Action, allow, deny} = require("express-junction");

// Controller の生成
var controller = new Controller("home");

// GET: /home/index
controller.add(new Action(
    "GET",
    "index",
    function (request, response) {
        return this.view({ title: "/home/index" });
    }
));

// Controller のエクスポート
module.exports = controller;

コントローラー、アクションともにインスタンス生成時に各種設定を行います。

Controller インスタンス生成時の引数は以下の通りです。

name
string コントローラー名を指定します。 URLの一部になります。

Action インスタンス生成時の引数は以下の通りです。

method
string HTTPリクエストメソッドを指定します。
name
string アクション名を指定します。 URLの一部になります。
[rules]
Validator[] オプションでアクセス制御を指定できます。 指定しなければすべてのユーザーに対してアクセス許可になります。
process
function(Request, Response) アクションが呼ばれたときに実行する処理を記述します。 Viewテンプレートでレスポンスする場合、this.view() を使用します。 JSONでレスポンスする場合、this.json() を使用します。 リダイレクトは this.redirect() です。

/views/home/index.ejs

<!DOCTYPE html>
<html>
    <head>
        <title><%= title %></title>
        <meta charset="utf-8">
    </head>
    <body>
        <h1>Hello World</h1>
        <p>This is a sample page.</p>
    </body>
</html>

何の変哲もない ejs ファイル…。 コントローラーで this.view() が実行された際に呼び出されます。