LoginSignup
11
11

More than 5 years have passed since last update.

Node.jsにおけるルーティングの話(MVC実装まで)

Last updated at Posted at 2018-12-03

node.jsどころかweb系ほとんど初心者知識しかなかったのですが、集中的に2ヶ月ほど独学で学んできたので分かったことを書こうかと。

今回はルーティングの話です。

node.jsのプロジェクトの基本

今回はフレームワークにExpressを使っています。
基本的にはapp.jsですべての処理が指示されます。(bin/wwwもありますが...)

app.js -> router -> Model(View)
といった感じに処理を分けることもできます。
というか、それが基本です。

以下の例では、最後の部分でルーターに処理を指示しています。

app.js
const createError = require('http-errors');
const express = require('express');
const path = require('path');
const cookieParser = require('cookie-parser');
const logger = require('morgan');
const bodyPaser = require("body-parser");
const fs = require("fs");

const index = require('./routes/index');

coonst app = express();

// view engine setup
const.set('views', path.join(__dirname, 'views'));
const.set('view engine', 'pug');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', index);

ルーティングって何?

簡単に言えば特定のhttpアクセスが来た時にどのように処理をするのかということです。
get(URLへのアクセス)が来たらどんな処理をするとか、post(付加情報を持ったアクセス)が来たらどんな処理をするとか、
アプリケーションにおける基本的な操作を担う処理です。

routes/index.js
//getの例
router.get('/index', (req, res) => {
  res.send('index');
});

//postの例
router.post('/', (req, res) => {
  req.body.title;
  res.send('index');
}

views/index.html
 <!--postの例 -->
<form method="post" action="/">
<input type="submit" name="title">

<!--getの例-->
<a href="/">

ルーティングの必要性

はじめ小さいプロダクトだとルーターを分ける必要性を全く感じません。

なぜなら分けなくても動くから。

なんならapp.jsにすべての処理を書いても動きます!
だから何でルーターも分けるの?と思います。

ただ機能を追加していくうちにhttpアクセスの分岐の数も増えていきます。('/top/add/id' のように)
そういったときにひとつのルーターに記述するのでは処理が分かりづらいし、手直しもしづらいです。

そのためルーターは分ける必要があります。

app.js

app.use('/login', login); //ログインおよびログインから派生する処理(アカウント作成など)
app.use('/top', top); //topページの処理
app.use('/', index); //適当な処理
app.use('/users', users); //ユーザー画面

node.jsでのMVCの構築

ここは悩みました。
ルーターがあることでコントローラーの役割が分からなくなり、どのように役割を分けようかと。

ただ小さなプロダクトを作ってみた感じ、コントローラーはいらないです。

基本的には
Model・・・データベストのやり取りをする関数群
View・・・viewテンプレートをhtml変換して送る処理
Controller・・・MVへの指示

といったような役割で分けると思いますがルーターもコントローラーも同じ役割です。
ただ処理が複雑になったりプロダクトが大きくなってくる(ログイン、topページからさらに分かれる処理、個々のユーザの処理、などなど)とルーターの次にコントローラーを作る必要が出てくるかと思います。

ちなみにルーターでviewテンプレートをレンダリングできるのでviewもあまり必要ない気もします。
MVC.PNG

以上ですが、また分かったことがあれば追記します。

11
11
0

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
11
11