タイプスクリプトベースのルータの適用方法[node.js]


緒論


以前の文書では、index.tsファイルにおいて、ユーザテーブルにおいてCRUDを行うすべてのミドルウェアが実装されている.
しかし、実際のプロジェクトを行うと、テーブルの数が多くなり、プロジェクト構造が複雑になります.したがって、プロジェクトを行うときは、テーブル(または機能)でファイルを分離することに慣れています.
そこで、この記事では、JavaScriptとは異なり、タイプスクリプト環境でルーティングを行う方法について簡単に説明します.
シリーズ1,2の内容を基にした内容であるため、開発環境設定をしていない人はシリーズ1シリーズ。を参照することができる.
また、Javascript+Expressベースのルーティング方法については、ここです。を参照してください.

ファイル構造の変更


機能別にファイルを分離するために、srcディレクトリにroutesディレクトリが作成されました.
typeorm-example
├── src
│   ├── entity
│   │   └── User.ts
│   ├── migration
│   ├── routes (새로 추가된 디렉토리)
│   └── index.ts
├── node_modules
├── ormconfig.js
├── package-lock.json
├── package.json
├── README.md
├── .gitignore
└── tsconfig.json
次に、routesディレクトリ内に、以前に実装されたCRUDユーザテーブルの4つのミドルウェアを分離するためのuesr.tsというファイルが作成される.srcのディレクトリ構造を見てみましょう.
src
 ├── entity
 │   └── User.ts
 ├── migration
 ├── routes (새로 추가된 디렉토리)
 │   └── user.ts (새로 추가된 파일)
 └── index.ts

user.tsファイルの定義


ファイルを定義する前に、まずJavaScriptベースでルーティングを定義するときに、次のコードを定義できます.
const express = require('express');
const router = express.Router();

router.get('', (req, res, next) => {
    res.send("Hello world");
});

module.exports = router;
このようにExpressのRouting()メソッドをmodule.exports = ...形式として定義する.
タイプスクリプトのルーティングを定義するには、次の手順に従います.
import express, { Request, Response, NextFunction } from 'express';


const router = express.Router();

router.get('', async (req: Request, res: Response, next: NextFunction) => {
  res.send("Hello world");
});

export = router;
JavaScriptコードとほとんど似ていますが、モジュールのインポートとエクスポートの部分に違いがあることがわかります.
インデックスとしてUser Entityファイルをインポートtsファイルで定義したCRUDミドルウェアを再定義しました.user.tsの完全なコードは次のとおりです.
import express, { Request, Response, NextFunction } from 'express';
import { User } from "../entity/User";

const router = express.Router();

router.get('/', async (req: Request, res: Response, next: NextFunction) => {
    const users = await User.find();
    res.send(users);
});

router.post('/', async (req: Request, res: Response, next: NextFunction) => {
   const user = new User();

   const {
        firstName,
        lastName,
        age
   } = req.body;
   
   user.firstName = firstName;
   user.lastName = lastName;
   user.age = age;

   await user.save().then((user) => {
       res.status(201).send(user);
   })
   .catch((err) => {
        res.status(400).send(err);
   });
});

router.patch('/', async (req: Request, res: Response, next: NextFunction) => {
    await User.update({
        id: 1,
    }, {
        age: 30,
    }).then((result) => {
        res.status(200).send(result);
    }).catch((err) => {
        res.status(400).send(err);
    });
});

router.delete('/', async (req: Request, res: Response, next: NextFunction) => {
    await User.delete({firstName: 'minsu'})
    .then((result) => {
        res.status(204).send(result);
    })
    .catch((err) => {
        res.send(err);
    })
});

export = router;

index.tsファイルの変更


index.tsファイルは4つのユーザテーブルに4つのミドルウェアを定義する必要がないため、修正コードは以下の通りである.
import "reflect-metadata";
import {createConnection} from "typeorm";
import userRouter from "./routes/user"; // 해당 부분 추가

import express, { Request, Response, NextFunction } from 'express';

import bodyParser from 'body-parser'; 

const app = express();

app.use(bodyParser.urlencoded({extended:true})); 
app.use(bodyParser.json());

app.use('/user', userRouter); // 해당 부분 추가


app.listen(3000, () => {
    console.log('Starting Server with 3000 port');

    createConnection().then(async connection => {
        console.log("디비 연결 성공");
    
    }).catch(error => console.log(error));

});
routes/user.tsをもたらし、このときuserRouterと名付けられた.
プロジェクトの規模が拡大するにつれて、複数のルーティングファイルが存在する可能性があるため、適切に命名することも重要な要素である可能性があります.
その後、app.use('/user', userRouter);コードによってミドルウェアが追加された.
前述したように、ミドルウェアを定義した後、REST要求をlocalhost:3000/user経路で送信することができる.
これにより、修正コードはindex.tsファイルのサイズを縮小し、ファイルを機能別に区分することができ、メンテナンスと効率を向上させることができる.

検査結果


まず、ユーザテーブルのデータを初期化します.この状態でGETリクエストをパスに送信すると、結果は以下のようになります.
(delete、update、create機能の結果は省略😅)