TypeScript、Express.js、Joi 検証、オブジェクト指向プログラミングを使用した REST API でのカスタム エラー処理

WBOY
リリース: 2024-07-27 20:41:12
オリジナル
1074 人が閲覧しました

Custom error handling in a REST API using TypeScript, Express.js, Joi validation, and object-oriented programming

こんにちは、開発者さん!

堅牢で保守可能な REST API を構築するには、エラー処理、検証、構造について慎重に検討する必要があります。この記事では、TypeScript、Express.js、検証用の Joi、およびオブジェクト指向プログラミング (OOP) の原則を使用して、REST API でカスタム エラー処理メカニズムをセットアップする方法を説明します。プロジェクトを次のように構成します:

構造:

---ソース
-----ミドルウェア
--------ErrorHanlder.ts
-----モデル
--------User.ts
-----リポジトリ
--------UserRepository.ts
-----ルート
--------UserRouter.ts
-----コントローラー
--------UserController.ts
-----サービス
--------UserService.ts
-----検証
--------UserValidation.ts
---app.ts
---server.ts

プロジェクトのセットアップ

mkdir rest-api
cd rest-api
npm init -y
npm install express typescript @types/node @types/express ts-node-dev
npx tsc --init
ログイン後にコピー

エラー処理用ミドルウェア

// src/middlewares/ErrorHandler.ts
import { Request, Response, NextFunction } from 'express';

class ErrorHandler extends Error {
  statusCode: number;
  message: string;

  constructor(statusCode: number, message: string) {
    super();
    this.statusCode = statusCode;
    this.message = message;
  }
}

const handleError = (err: ErrorHandler, req: Request, res: Response, next: NextFunction) => {
  const { statusCode, message } = err;
  res.status(statusCode).json({
    status: 'error',
    statusCode,
    message,
  });
};

export { ErrorHandler, handleError };

ログイン後にコピー

ユーザーモデル

// src/models/User.ts
export interface User {
  id: number;
  name: string;
  email: string;
}

ログイン後にコピー

ユーザーリポジトリ

// src/repository/UserRepository.ts
import { User } from '../models/User';

class UserRepository {
  private users: User[] = [];

  findAll(): User[] {
    return this.users;
  }

  findById(id: number): User | undefined {
    return this.users.find(user => user.id === id);
  }

  create(user: User): User {
    this.users.push(user);
    return user;
  }
}

export default new UserRepository();

ログイン後にコピー

ユーザーサービス

// src/services/UserService.ts
import UserRepository from '../repository/UserRepository';
import { User } from '../models/User';
import { ErrorHandler } from '../middlewares/ErrorHandler';

class UserService {
  getAllUsers(): User[] {
    return UserRepository.findAll();
  }

  getUserById(id: number): User | undefined {
    const user = UserRepository.findById(id);
    if (!user) {
      throw new ErrorHandler(404, 'User not found');
    }
    return user;
  }

  createUser(user: User): User {
    const { error } = userSchema.validate(user);
    if (error) {
      throw new ErrorHandler(400, error.details[0].message);
    }
    return UserRepository.create(user);
  }
}

export default new UserService();


ログイン後にコピー

ユーザーの検証

// src/validations/UserValidation.ts
import Joi from 'joi';

const userSchema = Joi.object({
  id: Joi.number().required(),
  name: Joi.string().required(),
  email: Joi.string().email().required(),
});

export { userSchema };

ログイン後にコピー

ユーザーコントローラー

// src/controllers/UserController.ts
import { Request, Response, NextFunction } from 'express';
import UserService from '../services/UserService';
import { ErrorHandler } from '../middlewares/ErrorHandler';

class UserController {
  getAllUsers(req: Request, res: Response, next: NextFunction) {
    try {
      const users = UserService.getAllUsers();
      res.json(users);
    } catch (error) {
      next(error);
    }
  }

  getUserById(req: Request, res: Response, next: NextFunction) {
    try {
      const user = UserService.getUserById(parseInt(req.params.id));
      res.json(user);
    } catch (error) {
      next(error);
    }
  }

  createUser(req: Request, res: Response, next: NextFunction) {
    try {
      const user = UserService.createUser(req.body);
      res.status(201).json(user);
    } catch (error) {
      next(error);
    }
  }
}

export default new UserController();


ログイン後にコピー

ユーザールート

// src/routes/UserRouter.ts
import { Router } from 'express';
import UserController from '../controllers/UserController';

const router = Router();

router.get('/users', UserController.getAllUsers);
router.get('/users/:id', UserController.getUserById);
router.post('/users', UserController.createUser);

export default router;

ログイン後にコピー

アプリケーションのエントリポイント

// src/app.ts
import express from 'express';
import UserRouter from './routes/UserRouter';
import { handleError } from './middlewares/ErrorHandler';

const app = express();

app.use(express.json());
app.use('/api', UserRouter);
app.use(handleError);

export default app;

ログイン後にコピー

サーバーのセットアップ

// src/server.ts
import app from './app';

const PORT = process.env.PORT || 3000;

app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});

ログイン後にコピー

TypeScript、Express.js、Joi、OOP の原則を使用してプロジェクトを構築することで、クリーンで保守しやすいコードベースを実現します。カスタム エラー処理ミドルウェアは、アプリケーション全体でエラーを管理する一貫した方法を提供し、検証ロジックはデータの整合性を保証します。このセットアップは、より複雑なアプリケーションの強固な基盤として機能します。

連絡先
メール: luizcalaca@gmail.com
インスタグラム: https://www.instagram.com/luizcalaca
Linkedin: https://www.linkedin.com/in/luizcalaca/
Twitter: https://twitter.com/luizcalaca

以上がTypeScript、Express.js、Joi 検証、オブジェクト指向プログラミングを使用した REST API でのカスタム エラー処理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!