Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

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

Ken_Fujimoto
渋谷のweb系エンジニア AWSに強いです。
https://xkenshirou.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした