|
|
|
import * as express from "express";
|
|
|
|
|
|
|
|
import ApiError from "@common/ApiError";
|
|
|
|
import { ErrorCode } from "@common/ErrorCode";
|
|
|
|
|
|
|
|
const isDev = process.env.NODE_ENV === "development";
|
|
|
|
|
|
|
|
const errorHandler: express.ErrorRequestHandler = (
|
|
|
|
err: any,
|
|
|
|
req: express.Request,
|
|
|
|
res: express.Response,
|
|
|
|
next: express.NextFunction
|
|
|
|
) => {
|
|
|
|
if (err instanceof ApiError) {
|
|
|
|
// TODO: different content-type?
|
|
|
|
res.status(err.statusCode).json(err.toJSON(isDev));
|
|
|
|
} else if (err) {
|
|
|
|
let error: ApiError;
|
|
|
|
if (err.code === "ENOENT") {
|
|
|
|
error = new ApiError(
|
|
|
|
"The specified resource could not be found",
|
|
|
|
ErrorCode.NotFound,
|
|
|
|
err
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
error = new ApiError(
|
|
|
|
"An internal server error has occurred",
|
|
|
|
ErrorCode.Internal,
|
|
|
|
err.stack ? err.stack : err
|
|
|
|
);
|
|
|
|
}
|
|
|
|
errorHandler(error, req, res, next);
|
|
|
|
}
|
|
|
|
next();
|
|
|
|
};
|
|
|
|
|
|
|
|
export default errorHandler;
|