こんにちは、らいうです

このサービスはフロントがNuxt, バックエンドがNode.js + Expressで開発されています。

Expressは小さなものをじゃっと作っちゃうときは結構楽なのですが、ある程度の規模からコードをしっかりと分割したくなってきます。

今回は、その方法を備忘録としてまとめておきます

構成

前提として

・ Express
・ Sequelize(node.jsで使えるORM)

をつかうことにします。

このときファイル構成を僕はこうしました

|--index.js
|--controllers
|  |--ArticleController.js
|  |--UserController.js
|  |--etc
|
|--models(sequelizeで生成されるやつ)
|

基本はこんな感じでcontrollerを作ることで、laravelやrailsとかでも使うような一般的なweb開発に近い形で、見通しの良い、見慣れた構造にできました。

dbのインスタンスを渡す

最近のバージョンのsequelizeでは一般的に、modelsディレクトリにindex.jsが作られて、それがmodels以下に配置されているすべてのmodelオブジェクトを格納した状態のインスタンスを持ってきてくれます。

たとえば

|--models
   |--index.js
   |--articles.js
   |--users.js
   |--etc

となっているときに、

アプリケーションの方のコードで

const db = require('./models/')

とすれば、
db.users, db.articles
といった具合に、各モデルでの操作が可能になります。

controllerの作成

一般的にlaravelとかではcontrollerはクラスであることが多いと思いますが、今回はシンプルさを優先して関数コンポーネントっぽい考え方で作成しました。

例えばUserControllerなんかは

// 最初にdbに関するオブジェクトをimport
const db = require('../models')

module.exports = {
  checkAddressRegistered: async function checkAddressRegistered(req, res) {
    // 処理
    
    res.status(200).send(returnObj);
  },
  signup: async function signup(req, res) {
    // 処理
    res.status(201).send(returnObj);
  },
  etc
}

こんな感じで書きました。

アプリ側でcontrollerの関数を呼び出す

プロジェクトルート直下のindex.jsがルーティングの役割をしてくれているのでここでcontrollerに処理を委譲します

const express = require("express")
const UserController = require('./controllers/UserController')

const app = express()
app.post("/myInfo", UserController.getMyInfo)

こんな感じで書いていくことで、アプリケーションコードがすっきりして見通しがよくなり開発がしやすくなりますね