Web Developer's Struggle Memories

日々の業務から思ったこと、学んだことを書き連ねていきます。

Practices of directory composition using expressjs

せっかく仕事でNode.js(というかExpress)使ってるので、そこで実現場での使い方の例を参考にメモする。(そのまんまだとあれなので、加工済み)

あと英語の勉強のため、何気にタイトルやらヘッダやらを英語にしています。

Anyway, directory structure

./
├── app/
│   ├── app.js
│   ├── server.js
│   ├── routes.js
│   │
│   ├── controllers/
│   ├── models/
│   ├── routes/
│   ├── modules/
│   │     ├── errors/
│   │     └── validators/
│   └── services/
│
├── test
│   ├── functional/
│   │     ├── controllers/
│   │     ├── models/
│   │     ├── modules/
│   │     └── services/
│   └── senario/
│
├── config/
├── logs/
└── node_modules/

How to use each file

  • app.js

アプリの全体的な定義を書いたもの。

// 利用するモジュール群の読み込み
const hoge = require('hoge')
const express = require('express ')
const app = express()

// ルーティングの定義
const route = require('./routes')
// エラーハンドラの定義
const errorHandler = require('./services/error_handler')

// 不要なヘッダの削除
app.disable('x-powerd-by')
app.disable('etag')

// キャッシュの無効化
app.use((req, res, next) => {
   res.setHeader('Cache-Control', 'no-cache')
   next()
})

// リクエスト前のミドルウェア処理
app.use(hoge())

// ルーティング処理
// 今回の例では認証がいるもの、いらないもので分ける
app.use('path_to_app', route.getNonAuthRoute())
app.use('path_to_app', route.getAuthRoute())

// エラーハンドリング
app.use(errorHandler)

module.exports = app
  • routes.js

文字通りルーティング処理を書いたもの。

const express = require('express')
router = express.Router()

// 各コントローラを読み込む
const hogeController = require('./controllers/hoge')
const fugaController = require('./controllers/fuga')
const piyoController = require('./controllers/piyo')
const mogeController = require('./controllers/moge')


const getAuthRoute = (router) => {
   router.get('path_to_app1', hogeController.get)
   router.post('path_to_app2', fugaController.post)
   router.patch('path_to_app3', piyoController.patch)
   router.delete('path_to_app4', mogeController.delete)

   return router
}
module.exports.getAuthRoute = getAuthRoute

const getNonAuthRoute = (router) => {
   router.get('path_to_app1', hogeController.get)
   router.post('path_to_app2', fugaController.post)
   router.patch('path_to_app3', piyoController.patch)
   router.delete('path_to_app4', mogeController.delete)

   return router
}
module.exports.getNonAuthRoute = getNonAuthRoute
  • server.js

サーバー起動処理を書いたもの。

const app = require('./app')
const http = require('http')

// エラーリスナー
const onError = (error ) => {
   // エラーを検知した時の処理
   // throw error
}

// イベントリスナー
const onListening = () = > {
   // 何かしらのイベントを検知した時の処理
}

// ポートの設定
const port = process.env.PORT || '3000'
app.set('port', port)

// サーバー生成
const server = http.createServer(app)
// サーバー起動
server.listen(port)

// リスナー設定
server.on('error', onError)
server.on('listening', onListening)

module.exports = server

that’s all !!