TypeScript, Express.js, Joi 유효성 검사 및 객체 지향 프로그래밍을 사용하는 REST API의 사용자 정의 오류 처리

WBOY
풀어 주다: 2024-07-27 20:41:12
원래의
983명이 탐색했습니다.

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에서 사용자 정의 오류 처리 메커니즘을 설정하는 방법을 살펴보겠습니다. 우리는 프로젝트를 다음과 같이 구성할 것입니다:

구조:

---src
-----미들웨어
--------ErrorHanlder.ts
-----모델
--------User.ts
-----저장소
--------UserRepository.ts
-----경로
--------UserRouter.ts
-----컨트롤러
--------UserController.ts
-----서비스
--------UserService.ts
-----검증
--------UserValidation.ts
---app.ts
---서버.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
링크드인: https://www.linkedin.com/in/luizcalaca/
트위터: https://twitter.com/luizcalaca

위 내용은 TypeScript, Express.js, Joi 유효성 검사 및 객체 지향 프로그래밍을 사용하는 REST API의 사용자 정의 오류 처리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!