Skip to content

Commit

Permalink
fix: error handling
Browse files Browse the repository at this point in the history
  • Loading branch information
genzyy committed Nov 11, 2023
1 parent 92b5546 commit e4868cc
Show file tree
Hide file tree
Showing 5 changed files with 17 additions and 25 deletions.
8 changes: 4 additions & 4 deletions src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ app.use(compression());
app.use(passport.initialize());
passport.use('jwt', JwtStrategy);

if (config.environment != 'development') StartAllJobs();

app.use('/v1', routes);

app.use((req, res, next) => {
next(new NotFound());
});
Expand All @@ -38,8 +42,4 @@ app.use(errorConverter);
app.use(errorHandler);
app.use(ValidateApiMetadata);

StartAllJobs();

app.use('/v1', routes);

export default app;
10 changes: 5 additions & 5 deletions src/controllers/auth.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ const register = catchAsync(async (req: Request, res: Response) => {

const login = catchAsync(async (req: Request, res: Response) => {
const { email, password } = req.body;
const accessToken = getUserAccessToken(req);
const accessToken = await getUserAccessToken(req);
const userId = JwtService.verifyToken(accessToken);
const user = await userRepository.getUserByEmailAndId(email, userId);

Expand All @@ -33,14 +33,14 @@ const login = catchAsync(async (req: Request, res: Response) => {
return res.send(OK).send({ user: exclude(user, ['password', 'signedOut']) });
});

const getMe = async (req: Request, res: Response) => {
const accessToken = getUserAccessToken(req);
const getMe = catchAsync(async (req: Request, res: Response) => {
const accessToken = await getUserAccessToken(req);
const userId = JwtService.verifyToken(accessToken);
const dbUser = await userRepository.getUser(userId, UserReturn);
return res.status(OK).send({ ...dbUser });
};
});

const getUserAccessToken = (req: Request): string => {
const getUserAccessToken = async (req: Request): Promise<string> => {
const { authorization } = req.headers;
const values = authorization?.split(' ');
if (values && values.length >= 2) return values[1];
Expand Down
7 changes: 3 additions & 4 deletions src/core/middlewares/error.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,22 @@ import ApiError from '../../utils/ApiError';

export const errorConverter: ErrorRequestHandler = (err, req, res, next) => {
let error = undefined;
const { statusCode: errStatusCode, message: errMessage, stack } = err;
const { statusCode: errStatusCode, message: errMessage } = err;
if (!(err instanceof ApiError)) {
const statusCode =
errStatusCode || err instanceof Prisma.PrismaClientKnownRequestError
? httpStatus.BAD_REQUEST
: httpStatus.SERVICE_UNAVAILABLE;
const message = errMessage || httpStatus[statusCode];
error = new ApiError(statusCode, message, false, stack);
error = new ApiError(statusCode, message, false);
}
next(error);
};

// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars
export const errorHandler: ErrorRequestHandler = (err, req, res, next) => {
let { statusCode, message } = err;
const { isOperational, stack } = err;
const { isOperational } = err;
if (config.environment === 'production' && !isOperational) {
statusCode = httpStatus.INTERNAL_SERVER_ERROR;
message = httpStatus[statusCode];
Expand All @@ -33,7 +33,6 @@ export const errorHandler: ErrorRequestHandler = (err, req, res, next) => {
const response = {
code: statusCode,
message,
...(config.environment === 'development' && { stack }),
};

if (config.environment === 'development') {
Expand Down
12 changes: 1 addition & 11 deletions src/utils/ApiError.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,10 @@ class ApiError extends Error {
statusCode: number;
isOperational: boolean;

constructor(
statusCode: number,
message: string | undefined,
isOperational: boolean = true,
stack: string = '',
) {
constructor(statusCode: number, message: string | undefined, isOperational: boolean = true) {
super(message);
this.statusCode = statusCode;
this.isOperational = isOperational;
if (stack) {
this.stack = stack;
} else {
Error.captureStackTrace(this, this.constructor);
}
}
}

Expand Down
5 changes: 4 additions & 1 deletion src/utils/catchAsync.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,10 @@ const catchAsync =
res: Response<any, Record<string, any>, number>,
next: NextFunction,
) => {
Promise.resolve(fn(req, res, next)).catch((err) => next(err));
Promise.resolve(fn(req, res, next)).catch((err) => {
console.log('yes');
return next(err);
});
};

export default catchAsync;

0 comments on commit e4868cc

Please sign in to comment.