ホームページ > 記事 > ウェブフロントエンド > TypeScript、Express.js、Joi 検証、オブジェクト指向プログラミングを使用した REST API でのカスタム エラー処理
堅牢で保守可能な 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 サイトの他の関連記事を参照してください。