Pengendalian ralat tersuai dalam API REST menggunakan TypeScript, Express.js, pengesahan Joi dan pengaturcaraan berorientasikan objek

WBOY
Lepaskan: 2024-07-27 20:41:12
asal
1099 orang telah melayarinya

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

Hai, Devs!

Membina API REST yang teguh dan boleh diselenggara memerlukan pertimbangan yang teliti terhadap pengendalian ralat, pengesahan dan struktur. Dalam artikel ini, kami akan meneroka cara menyediakan mekanisme pengendalian ralat tersuai dalam API REST menggunakan TypeScript, Express.js, Joi untuk pengesahan dan prinsip pengaturcaraan berorientasikan objek (OOP). Kami akan menstrukturkan projek kami seperti berikut:

Skruktur:

---src
-----peranti tengah
--------ErrorHanlder.ts
-----model
--------User.ts
-----repositori
--------UserRepository.ts
-----laluan
--------UserRouter.ts
-----pengawal
--------UserController.ts
-----perkhidmatan
--------UserService.ts
-----pengesahan
--------UserValidation.ts
---app.ts
---server.ts

Menyediakan Projek

mkdir rest-api
cd rest-api
npm init -y
npm install express typescript @types/node @types/express ts-node-dev
npx tsc --init
Salin selepas log masuk

Middleware untuk Pengendalian Ralat

// 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 };

Salin selepas log masuk

Model Pengguna

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

Salin selepas log masuk

Repositori Pengguna

// 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();

Salin selepas log masuk

Perkhidmatan Pengguna

// 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();


Salin selepas log masuk

Pengesahan Pengguna

// 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 };

Salin selepas log masuk

Pengawal Pengguna

// 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();


Salin selepas log masuk

Laluan Pengguna

// 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;

Salin selepas log masuk

Titik Kemasukan Permohonan

// 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;

Salin selepas log masuk

Persediaan Pelayan

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

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

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

Salin selepas log masuk

Dengan menstrukturkan projek kami menggunakan prinsip TypeScript, Express.js, Joi dan OOP, kami mencapai pangkalan kod yang bersih dan boleh diselenggara. Perisian tengah pengendalian ralat tersuai menyediakan cara yang konsisten untuk mengurus ralat merentas aplikasi, manakala logik pengesahan memastikan integriti data. Persediaan ini boleh berfungsi sebagai asas yang kukuh untuk aplikasi yang lebih kompleks.

Kenalan
E-mel: luizcalaca@gmail.com
Instagram: https://www.instagram.com/luizcalaca
Linkedin: https://www.linkedin.com/in/luizcalaca/
Twitter: https://twitter.com/luizcalaca

Atas ialah kandungan terperinci Pengendalian ralat tersuai dalam API REST menggunakan TypeScript, Express.js, pengesahan Joi dan pengaturcaraan berorientasikan objek. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan