建構健壯且可維護的 REST API 需要仔細考慮錯誤處理、驗證和結構。在本文中,我們將探討如何使用 TypeScript、Express.js、Joi 進行驗證以及物件導向程式設計 (OOP) 的原理,在 REST API 中設定自訂錯誤處理機制。我們將按如下方式建立我們的專案:
結構:
---src
-----中介軟體
--------ErrorHanlder.ts
-----模型
--------用戶.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
Instagram:https://www.instagram.com/luizcalaca
Linkedin:https://www.linkedin.com/in/luizcalaca/
推特:https://twitter.com/luizcalaca
以上是使用 TypeScript、Express.js、Joi 驗證和物件導向程式設計的 REST API 中的自訂錯誤處理的詳細內容。更多資訊請關注PHP中文網其他相關文章!