提问人:Thore 提问时间:9/27/2023 更新时间:9/27/2023 访问量:49
抛出自定义错误类会导致 instanceof Error 而不是自定义错误类
Throwing custom error class results in instanceof Error instead of custom error class
问:
我做了一些特定的错误类,比如 和 。所有扩展都是 Nodejs 的 Error 类的扩展。NotFoundError
ConflictError
UnauthorizedError
BaseError
当抛出我的一个自定义错误时,我应该期望该错误的实例是所选错误的类名。例如,我希望错误具有 .事实并非如此,因为我的 errorHandler 中间件中的传入错误是实例 Error。throw new UnauthorizedError('Missing api-key')
UnauthorizedError
我需要这个实例来处理基于实例返回客户端的特定响应,如下所示。
error-handler.middleware.ts
export const errorHandler = (error: unknown, req: Request, res: Response, next: NextFunction) => {
console.log('Instance of', error?.constructor.name);
if (error instanceof ValidationError) {
return res.status(error.status).json({ errors: error.errors });
}
if (error instanceof UnauthorizedError) {
return res.status(error.status).send({ error: error.message });
}
if (error instanceof BaseError) {
return res.status(error.status).send({ error: error.message });
}
if (error instanceof Error) {
return res.status(HttpCode.INTERNAL_SERVER_ERROR).json({
message: 'Internal Server Error',
});
}
next();
};
我错过了什么或做错了什么?下面是关于我谈到的部分的更多代码。
base.error.ts
export class BaseError extends Error {
status: number;
message: string;
constructor(status: number, message: string) {
super(message);
this.status = status;
this.message = message;
}
}
unauthorized.error.ts
import { BaseError } from './base.error';
export class UnauthorizedError extends BaseError {
message: string;
constructor(message: string = 'Unauthorized to perform this action') {
super(HttpCode.UNAUTHORIZED, message);
this.message = message;
}
}
api-key-handler.middleware.ts
export const validateApiKey = async (req: Request, res: Response, next: NextFunction) => {
const code = req.headers['x-api-key'] as string;
if (!code) {
throw new UnauthorizedError('Missing api-key');
}
next();
};
答:
0赞
Thore
9/27/2023
#1
添加base.error.ts的构造函数修复了它。Object.setPrototypeOf(this, new.target.prototype);
在这篇文章中找到了答案 Typescript - Extending Error 类(来自 @Grabofus 的答案)
评论