LoginSignup
55
67

More than 5 years have passed since last update.

Expressにおけるミドルウェアとルーティング方法

Last updated at Posted at 2018-05-29

前回の続きになります。

Expressにおけるミドルウェアとは

リクエスト / レスポンスのサイクルにおいて任意の処理を行う関数

できること

  • 任意コードの実行
  • リクエストオブジェクト, レスポンスオブジェクトの変更
  • リクエストレスポンスサイクルの終了
  • スタック内の次のミドルウェアの呼び出し

定義

通常処理の場合

function (req, res, next) {
    // 処理
    next();
}

エラー処理の場合

function (err, req, res, next){
    // 処理
    next();
}

利用方法

app.js
// モジュールを利用
var express = require("express");
var app = express();

// app.useにミドルウェアを引き渡す
app.use((req, res, next) => {
    // 処理
});

実装例

リクエスト情報を取得したい場合。

app.js
// moduleをrequire
var express = require("express");
var app = express();

// app.useにミドルウェアを引き渡す
app.use(require("./lib/logger.js"));
app.get("/", (req, res) => {
    res.status(200).send("Hello World");
});

// ポート指定でlisten
app.listen(3000);
loger.js
module.exports = function (req, res, next) {
    // ipアドレス
    var ipaddress = req.headers["x-forwarded-for"] ||
        req.connection.remoteAddress ||
        (req.socket && req.socket.remoteAddress) ||
        (req.connection.socket && req.connection.socket.remoteAddress) ||
        "0.0.0.0";
    // 日付
    var date = (new Date()).toISOString();
    // リクエストメソッド
    var method = req.method;
    // リクエストURL
    var url = req.url;
    // リクエストユーザーーエージェント
    var ua = req.headers["user-agent"];
    // ログ出力
    console.log(`${ipaddress} [${date}] "${method} ${url}" - ${ua}` );
    // 次のミドルウェアを呼ぶ
    next();
};

ログに各パラメータが、ブラウザにはHello Wolrdが出力される。

ルーティング

基本構文

app.METHOD(PATH, CALLBACK)
  • METHOD : リクエストメソッドを指定
  • PATH : URLルーティングを指定
  • CALLABCK : PATHにマッチした際の動作を指定

実装例

指定ルートでの挙動を書きたい場合。

app.js
var express = require("express");
var app = express();

// 「/home/index」にマッチした場合の動作を指定
app.get("/home/index", (req, res) => {
    res.status(200).send("OK");
});

app.listen(3000);

http://localhost:3000/home/index/にアクセスし、ブラウザ上に「OK」と出力されればOK。

パス設定について

名前付きパラメータを利用することで、URL中の値を分析してパラメータとして受け取ることができる。
また、正規表現を利用して記述することも可能。

実装例

app.js
var express = require("express");
var app = express();

// 「/user/:id」にマッチした場合の動作を指定
app.get("/user/:id", (req, res) => {
    console.log(res.params.id);
    res.status(200).send("OK");
});

app.listen(3000);

http://localhost:3000/12345/にアクセスし、ターミナル上に指定idが、ブラウザには「OK」が表示されればOK。

Routingモジュール

webアプリケーションが大きくなる場合は、ルーティングのモジュール化を行い、管理を簡単にする。

var router = express.Router()

実装例

例えば、共通ルートである/user/を外出ししたいような場合、以下のような処理となる。

app.js
var express = require("express");
var app = express();

// 「/user」パスの配下の処理を記述
app.use("/user", require("./router/user.js"))

app.listen(3000);
user.js
// ルーティングモジュールを呼び出し
var router = require("express").Router();

// routerに関わらず、アクセス日時を出力するミドルウェア
router.use((req, res, next) => {
    console.log((new Date()).toISOString());
    next();
});

// 「/user/」にマッチする場合の処理
router.get("/", (req, res) => {
    res.send("/user/");
});

// 「/user/about」にマッチする場合の処理
router.get("/about", (req, res) => {
    res.send("/user/about");
});

module.exports = router;

http://localhost:3000/user/aboutにアクセスし、ターミナル上にアクセス日付が、ブラウザには「/user/about/」が表示されればOK。

55
67
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
55
67