[Node.js] Express - Router


Routing

  • まず、Express公式サイトは、ルーティングを以下のように定義する.
  • アプリケーションエンドポイント(URI)の定義、およびURIが顧客要求に応答する方法.

  • すなわち、クライアントがどのように要求し、どのように応答を送信するかの定義です.

  • 以前はapp.get()の方法でルーティングを体験したことがある.公式サイトで提供されている例を簡単に見ることができます.
  • var express = require('express');
    var app = express();
    
    // respond with "hello world" when a GET request is made to the homepage
    app.get('/', function(req, res) {
      res.send('hello world');
    });

    Router

  • ルータはExpressが提供するクラスで、「ルーティング」を容易に処理できます.公式サイトにおいて、Routerクラスの利点は以下の通りである.
  • express.Routerクラスでは、モジュール化されたインストール可能ハンドルを作成できます.

  • モジュール化された取り付け可能なハンドルという言葉は理解しにくいが,簡単に言えばルータオブジェクト(ルーティングを助けるオブジェクト)を「モジュール」と理解し,必要な場所でロードして使用できるように理解できる.

  • ExpressのRouterオブジェクトはMiddlewareに基づいて実装されているため、Middlewareと同じ方法で使用されます.

  • 上記の例で示したapp.get()の方法でルーティングを行う場合、1つのjsファイル内ですべてのルーティングを処理する必要がある.ただし、express.Routerクラスは「Middleware」であるため、jsファイルをパスごとに作成してルータを管理することができます.これにより、コードの可読性が向上し、メンテナンスが容易になります.

  • 前回のレッスンで作成した例に簡単に追加すると、理解に役立つかもしれません.
  • // ./routes/goods.js
    
    // * routes 폴더에 goods.js 파일을 생성하였다.
    // * 즉, 현재 경로는 '/routes/goods.js 이다.
    
    // Express에서 제공하는 Router 클래스를 사용하여 객체를 만들기 위해, 
    // require를 사용하여 Express를 import 한다.
    const express = require('express');
    // Router 클래스를 호출하고 변수에 담아주면서, router 객체를 생성해준다. 
    const router = express.Router();
    
    // app.js 파일에서는 이 router를 '/api' 주소와 매칭시켰기 때문에, 
    // 아래의 요청 경로는 '/api' 뒤에 붙는 경로임을 확인하여야 한다.
    
    // '/api/' 경로로 들어오면 'this is root page'가 출력되도록 응답한다.
    router.get('/', (req, res) => {
      res.send('this is root page');
    });
    
    // '/api/goods' 경로로 들어오면 'this is goods page'가 출력되도록 응답한다.
    router.get('/goods', (req, res) => {
      res.send('this is goods page');
    });
    
    // 생성한 router를 모듈로 내보내준다.
    // 즉 app.js에서 실행할 수 있도록, export 한다.
    // export 하지 않으면, app.js 에서 router를 호출할 수 없게 된다.
    module.exports = router;
    
    // --------------------------------------
    
    // ./app.js
    // app을 실제로 실행하는 js파일
    
    // require: 모듈을 찾아서 import 한다.
    const express = require('express');
    const app = express();
    const port = 8080;
    
    // good.js에서 만들어준 router를 사용하기 위해, require를 사용해서 import 한다.
    // Express에서 제공하는 Router 클래스는 모듈로 사용이 가능하다고 했기 때문에, 
    // require를 통해 import하여 사용할 수 있다.
    // require 안에서 .js 확장자는 생략이 가능하다.
    const goodsRouter = require('./routes/goods');
    
    const requestMiddleware = (req, res, next) => {
      console.log(`Request URL: ${req.originalUrl}, ${new Date()}`);
      next();
    };
    
    app.use(requestMiddleware);
    
    // Router 객체는 Middleware와 동일하게 사용되기 때문에, 
    // app.use를 통해 사용할 수 있다. 
    // router는 여러개 정의할 수 있다. 
    // 즉, goodsRouter 외에 다른 router를 배열에 담아주면
    // 해당 배열 안에 있는 router들을 순회하며 매칭되는 경로의 응답을 수행한다.
    app.use('/api', [goodsRouter]);
    
    app.get('/', (req, res) => {
      res.send('Hello Express!');
    });
    
    app.listen(port, () => {
      console.log(`Server Started with port ${port}`);
    });
  • 以上のコードが記述された場合、各パスの結果は以下のようになる.
  • パスによる応答結果


  • localhost.8080/


  • localhost:8080/api


  • localhost:8080/api/goods