http-errors
Для зручного створення помилок скористаємось пакетом http-errors. Інсталюємо його командою:
npm install http-errors
Створюємо мідлвеар що буде займатись обробкою помилок. Один мідлвеар для обробок помилок, другий для обробки відсутності запрашуємо роутінга
import { isHttpError } from 'http-errors';
//Функція обробки помилок errorHandlerMiddleware.js
export const errorHandlerMiddleware = (error, req, res, next) => {
if (isHttpError(error)) {
res.status(error.status).json({
status: error.status,
message: error.message,
data: {"message": error.message},
});
} else {
res.status(500).json({
status: 500,
message: error.message,
});
}
};
// notFoundHendker.js
//Функція обробки помилок у разі відсутності маршруту
export const notFoundHandler = (req, res) => {
res.status(404).send('Oops! Route was not found!');
};
Підключаємо ці мідлвеари для обробки помилок у головний файл server.js
import express from 'express';
import pino from 'pino-http';
import cors from 'cors';
import { env } from './utils/env.js';
import { ENV_VARS } from './const/const.js';
import contactsRouter from './routers/contacts.js';
import { errorHandlerMiddleware } from './middlewares/errorHandler.js';
import { notFoundHandler } from './middlewares/notFoundHandler.js';
//Запуск сервера
export const setupServer=()=> {
//Ініціалізація сервера
const app = express();
// app.use(pino());
// app.use(
// pino({
// transport: {
// target: 'pino-pretty',
// },
// }),
// );
app.use(cors());
//Додавання middleware для парсингу JSON
app.use(
express.json({
limit: '1mb',
type: ['application/json', 'application/vnd.api+json'],
}),
);
//Підключення маршрутів
app.use(contactsRouter);
//підключення обробників помилок
app.use(errorHandlerMiddleware);
app.use(notFoundHandler);
//Запуск сервера
const PORT = env(ENV_VARS.PORT, 3000);
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
}
В модулі де необхідно обробити помилку, підключаємо бібліотеку і описуемо помилку
import createHttpError from 'http-errors';
export const getContactsById = async (id) => {
const idobj = { _id: id };
if (!mongoose.Types.ObjectId.isValid(id)) {
throw createHttpError(404, 'invalid ID');
}
const contactsfound = await ContactCollection.find(idobj);
if (!contactsfound || contactsfound.length === 0) {
throw createHttpError(404, `Contact with id ${id} not found!`);
}
return contactsfound;
}
Тепер при створенні помилки чере throw createHttpError(404, `Contact with id ${id} not found!`); бібліотека автоматично перехватить помилку і передасть в обробку у мідлваре errorHandlerMiddleware.js або notFoundHandler.js