抛出自定义错误类会导致 instanceof Error 而不是自定义错误类

Throwing custom error class results in instanceof Error instead of custom error class

提问人:Thore 提问时间:9/27/2023 更新时间:9/27/2023 访问量:49

问:

我做了一些特定的错误类,比如 和 。所有扩展都是 Nodejs 的 Error 类的扩展。NotFoundErrorConflictErrorUnauthorizedErrorBaseError

当抛出我的一个自定义错误时,我应该期望该错误的实例是所选错误的类名。例如,我希望错误具有 .事实并非如此,因为我的 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();
};
Node.js 快速 错误处理

评论


答:

0赞 Thore 9/27/2023 #1

添加base.error.ts的构造函数修复了它。Object.setPrototypeOf(this, new.target.prototype);

在这篇文章中找到了答案 Typescript - Extending Error 类(来自 @Grabofus 的答案)